2010-02-09 32 views
10

为什么下面的代码不起作用?我的意思是,它在控制台输出上显示各种奇怪的字符。为什么我需要刷新我的I/O流才能获得正确的结果?

#include <stdio.h> 
char mybuffer[80]; 
int main() 
{ 
    FILE * pFile; 
    pFile = fopen ("example.txt","r+"); 
    if (pFile == NULL) perror ("Error opening file"); 

    else { 
     fputs ("test",pFile); 

     fgets (mybuffer,80,pFile); 
     puts (mybuffer); 
     fclose (pFile); 
     return 0; 
    } 
} 

但是,下面的代码运行良好。

#include <stdio.h> 
char mybuffer[80]; 
int main() 
{ 
    FILE * pFile; 
    pFile = fopen ("example.txt","r+"); 
    if (pFile == NULL) perror ("Error opening file"); 

    else { 
     fputs ("test",pFile); 
     fflush (pFile);  
     fgets (mybuffer,80,pFile); 
     puts (mybuffer); 
     fclose (pFile); 
     return 0; 
    } 
} 

为什么我需要刷新流以获得正确的结果?

回答

12

此答案由于标准是这样说的(§7.19.5.3/ 5):

当一个文件被打开与更新模式 ( '+' 作为第二或在上述模式参数 值列表中的第三个字符 ),输入和输出可能是在关联流上执行的 。 然而,输出应不直接 接着输入没有 居间调用fflush 功能或文件定位 功能(FSEEK,fsetpos,或倒带), 和输入不得直接 随后输出无需除非输入操作 遇到文件结束,否则干预调用文件定位 函数。

有一个原因:输出和输入通常分开缓冲。当存在刷新或寻道时,它会将缓冲区与文件同步,但否则会让它们不同步。这大大提高了性能(例如,当您进行读取时,无需检查自从读取数据到缓冲区后您读取的位置是否已写入)。

+0

Thx很多!!!!!! – Jaebum 2010-02-09 16:47:05

+0

但为什么第二个来源的输出不是“测试”? 它只是没有显示任何内容。 – Jaebum 2010-02-09 17:04:15

+1

@Lee:简单的说,你从你写作的地方开始阅读,你需要回到开始工作。 – falstro 2010-02-09 17:22:23

2

它因为C文件io使用缓冲区。只有在刷新它时,才会写入磁盘,写入/ n字符或填充缓冲区。

因此,在第一种情况下,当您来读取文件时,您的文件不包含任何内容。

+0

但即使使用“test \ n”而不是“test”,它仍然不起作用。 – Jaebum 2010-02-09 16:32:42

+0

在这方面的答案是错误的:将\ n写入文件根本没有任何效果;您必须刷新文件或写入大量数据以便C库自行刷新(通常为4KiB)。 – 2010-02-09 16:38:08

+0

我认为\ n位取决于实现 - MS确实至少对于C++代码。 – gbjbaanb 2010-02-09 18:51:27

相关问题