我正在尝试用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}}在上面的代码片段中?
答案 0 :(得分:2)
按C11 7.21.5.3.7:
使用更新模式打开文件时...不应输出 直接跟着输入而没有对
fflush
进行干预 功能或文件定位功能(fseek
,fsetpos
或rewind
)并且输入不应直接跟随输出 除非输入,否则对文件定位功能进行干预调用 操作遇到文件结束。
标准无法保证在没有fflush()
调用的情况下获得相同输入的事实(尽管某些实现,包括glibc,允许它,所以看到它在这里工作并不奇怪)。
对于您的其他问题,不,您不能在此处使用fflush()
而不是fseek()
,因为您的fseek()
在输出操作之前,而不是输入操作。 fflush()
仅对输出流以及未输入最新操作的更新流有意义。