fopen()中r +模式的问题

时间:2014-01-27 04:56:30

标签: c file-io

我正在尝试用C语言打开文件的各种模式。我在r +,w +和a +的模式下稍微停留。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    .....
    /* make a file with something in it */
    if( (fp = fopen( filename, "w" )) )
    {
        fprintf( fp, "abcd" );
        fclose( fp );
    }
    /* see how r+ works */
    if( (fp = fopen( filename, "r+" )) )
    {
        int c = 0;

        /* read something */
        c = fgetc( fp );
        printf( "c is %c\n", c );

        /* write something */
        fseek( fp, -1, SEEK_CUR );
        fputc( 'x', fp );
        fflush(fp);

        /* read something */
        c = fgetc( fp );
        printf( "c is %c\n", c );

        /* rewind and show the whole thing */
        rewind( fp );
        while( (c = fgetc( fp )) != EOF )
        {
            printf( "c is %c\n", c );
        }

        fclose(fp);
    }

    return 0;
}

这给了我以下输出 -
c是一个
c是b
c是x
c是b
c是c
c是d

即使我删除了fflush() -

/* write something */
fseek( fp, -1, SEEK_CUR );
fputc( 'x', fp );
//fflush(fp);

它给了我相同的输出。那么为什么我能够在输出流上没有fflush()的情况下编写?(我是否正确fputc()在输出流上写入?)另外,我可以使用fflush()而不是{{ 1}}在上面的代码片段中?

1 个答案:

答案 0 :(得分:2)

按C11 7.21.5.3.7:

  

使用更新模式打开文件时...不应输出   直接跟着输入而没有对fflush进行干预   功能或文件定位功能(fseekfsetpos或   rewind)并且输入不应直接跟随输出   除非输入,否则对文件定位功能进行干预调用   操作遇到文件结束。

标准无法保证在没有fflush()调用的情况下获得相同输入的事实(尽管某些实现,包括glibc,允许它,所以看到它在这里工作并不奇怪)。

对于您的其他问题,不,您不能在此处使用fflush()而不是fseek(),因为您的fseek()在输出操作之前,而不是输入操作。 fflush()仅对输出流以及未输入最新操作的更新流有意义。