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

Matthias Andree matthias.andree@gmx.de
Thu Apr 1 12:53:00 GMT 2010


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);
>> 	  cnt--;
>> 	  dup++;
>> 	}
>>      }
>>      fclose(f);
>>
>> 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:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple



More information about the Cygwin mailing list