This is the mail archive of the cygwin mailing list for the Cygwin project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: fopen with "a+" does not respect setting file read position to start of file

Bengt-Arne Fjellner wrote on 2010-04-01:

On 2010-04-01 11:06 AM, Brebner, Gavin wrote:

We hit a problem in a code, and narrowed it down to a test case that does :

   while (cnt) {
     f=fopen(host_file, "a+");
     if (!f)
       perror("dup_host_file: Could not open hostfile");
     /* rewind(f); */
     while (cnt) {
       int ret=fscanf(f, "%s", line);
       if (ret != EOF) {
	  fprintf(f, "%s\n", line);

In earlier versions of cygwin we have, this works fine, however in the recently installed
versions, it no longer works. It seems that fopen(host_file, "a+") is NOT positioning the
read position at the start of the file as it should. Adding an explicit rewind(f) is a
work around.

Well if that worked previously it was a bug.

Not a Cygwin defect, but an application bug, and what Gavin named "work around" is actually the right fix.

POSIX explicitly states that the initial position beginning/end of file in append mode is implementation-defined, and the Cygwin documentation doesn't make promises either way. Linux and FreeBSD document BOF and EOF, respectively.

From the manual for fopen:
``a+'' Open for reading and writing. The file is created if it does not exist. The stream is positioned at the
end of the file. Subsequent writes to the file will always end up at the then current end of file, irre-
spective of any intervening fseek(3) or similar.

Irrelevant, as that is neither from POSIX nor from cygwin-doc-1.5-1.

Matthias Andree

Problem reports:
Unsubscribe info:

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]