[Search for users]
[Overall Top Noters]
[List of all Conferences]
[Download this site]
| 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 | 
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.R | Title | User | Personal Name
 | Date | Lines | 
|---|
| 9929.1 | found an answer | TKTV20::KOBAYASHI_E |  | Mon May 26 1997 02:45 | 11 | 
|  | 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
 |