[Search for users] [Overall Top Noters] [List of all Conferences] [Download this site]

Conference turris::digital_unix

Title:DIGITAL UNIX(FORMERLY KNOWN AS DEC OSF/1)
Notice:Welcome to the Digital UNIX Conference
Moderator:SMURF::DENHAM
Created:Thu Mar 16 1995
Last Modified:Fri Jun 06 1997
Last Successful Update:Fri Jun 06 1997
Number of topics:10068
Total number of notes:35879

9929.0. "fseek problem?" by TKTV20::KOBAYASHI_E () Fri May 23 1997 06:15

OSF/1 3.2A
AlphaServer2100

 A customer sent me a problem report. fseek return error.

% cat sample.c
#include <stdio.h>
#include <stdlib.h>

typedef struct logdata {
	int muno;
	int ovno;
	int time;
	} LOGDATA;

main()
{
	FILE *fp;
	int ret = 1;
	int data[3];
	long offset;

	offset = -sizeof(LOGDATA);

	fp = fopen("test.fil","r+");
	if (fp != NULL) {
		while( ret == 1) {
		ret = fread(data,sizeof(LOGDATA),1,fp);
		if (ret == 1) {
			printf("read data = %d %d\n",data[0],data[1]);
			printf(" file pos = %d\n",ftell(fp));

			printf("OFFSET %d\n",offset);
			ret = fseek(fp,offset,SEEK_CUR);
			if(ret == 0) {
				ret = fwrite(data,sizeof(LOGDATA),1,fp);
				if(ret == 1) {
				} else {
					perror("fwrite");
				}
			}else{
				perror("fseek");
			}
		}else{
			perror("fread");
		}
	}
	ret = fclose(fp);
	}else{
		perror("test.fil");
	}
}

% cc sample.c
% ./a.out
read data = 875770417 943142453
 file pos = 12
OFFSET -12
read data = 909456435 809056311
 file pos = -8168
OFFSET -12
fseek: Invalid argument
%

 But he add ftell() after fwrite() ,program is  everything fine.

% cat sample2.c
#include <stdio.h>
#include <stdlib.h>

typedef struct logdata {
	int muno;
	int ovno;
	int time;
	} LOGDATA;

main()
{
	FILE *fp;
	int ret = 1;
	int data[3];
	long offset;

	offset = -sizeof(LOGDATA);

	fp = fopen("test.fil","r+");
	if (fp != NULL) {
		while( ret == 1) {
		ret = fread(data,sizeof(LOGDATA),1,fp);
		if (ret == 1) {
			printf("read data = %d %d\n",data[0],data[1]);
			printf(" file pos = %d\n",ftell(fp));

			printf("OFFSET %d\n",offset);
			ret = fseek(fp,offset,SEEK_CUR);
			if(ret == 0) {
				ret = fwrite(data,sizeof(LOGDATA),1,fp); <- add this line
				if(ret == 1) {
				} else {
					perror("fwrite");
				}
			}else{
				perror("fseek");
			}
		}else{
			perror("fread");
		}
	}
	ret = fclose(fp);
	}else{
		perror("test.fil");
	}
}

% cc smaple2.c
% ./a.out
 file pos = 12
OFFSET -12
 file pos = 12
read data = 909456435 809056311
 file pos = 24
OFFSET -12
 file pos = 24
read data = 943142453 842084409
 file pos = 36
OFFSET -12
 file pos = 36
read data = 809056311 875770417
 file pos = 48
OFFSET -12
 file pos = 48

Can you tell me what's wrong here ?

Thanks in advice,

Eiji Kobayashi/CSC/MCS/DECJAPAN

T.RTitleUserPersonal
Name
DateLines
9929.1found an answerTKTV20::KOBAYASHI_EMon May 26 1997 03:4511
Sorry,I checked reference manual, And I found a answer.

After a call to the fseek() function,I had to call fflush()  before call to 
the
fseek() again.

Eiji Kobayashi/CSC/MCS/DECJAPAN