Message-ID: <3A12736A.CF611454@example.com> From: Nobody X-Mailer: Mozilla 4.75 [en] (X11; U; Linux 2.2.17 i686) X-Accept-Language: en MIME-Version: 1.0 Newsgroups: comp.os.msdos.djgpp Subject: possible fflush bug? Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Lines: 56 Date: Wed, 15 Nov 2000 05:28:42 -0600 NNTP-Posting-Host: 216.80.208.18 X-Complaints-To: abuse AT onemain DOT com X-Trace: nntp1.onemain.com 974287553 216.80.208.18 (Wed, 15 Nov 2000 06:25:53 EST) NNTP-Posting-Date: Wed, 15 Nov 2000 06:25:53 EST To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com I think I found a bug in fflush. I am using gcc2952b, djdev203b, and bnu281b. After creating a read/write binary file, writing to it, doing an absolute seek backwards, reading, and calling fflush on the FILE*, the file position as reported by ftell jumps to the end of the file; trying to read from the FILE* fails, and feof returns true. I ran into this bug in a larger program and created the demonstration below based on that. The demonstration code below prints the following with the above packages: pos after fwrite: 4 pos after fseek to 2: 2 pos after fgetc: 3 pos after fflush: 4 It prints this under Linux with RedHat's glibc-2.1.94-3, egcs-1.1.2-30, and binutils-2.10.0.18-1: pos after fwrite: 4 pos after fseek to 2: 2 pos after fgetc: 3 pos after fflush: 3 Workaround: fseek(fp, 0, SEEK_CUR); or fseek(fp, ftell(fp), SEEK_SET); before fflush(fp); To demonstrate: #include int main(void) { FILE *fp; int c; fp = fopen("foo", "w+b"); fwrite("foo\n", 1, 4, fp); printf("pos after fwrite: %ld\n", ftell(fp)); fseek(fp, 2, SEEK_SET); printf("pos after fseek to 2: %ld\n", ftell(fp)); c = fgetc(fp); printf("pos after fgetc: %ld\n", ftell(fp)); fflush(fp); printf("pos after fflush: %ld\n", ftell(fp)); fclose(fp); return 0; }