2012-04-13 105 views
0

我想读取一个文件的内容是一个3KB的缓冲区,然后将缓冲区的内容写入另一个文件。写入数据的文件仅包含写入数据的一部分。它的大小约为1KB。如何编写剩余的数据?从文件读取和写入文件是不一样

fp1 = fopen("a.txt","rb"); 
fp2 = fopen("b.txt","wb"); 

fread(buffer, 1, BUFFER_SIZE,fp1);//reading from file pointed to by fp1 
//BUFFER_SIZE = 3KB 
fwrite(buffer, 1, BUFFER_SIZE, fp2);//writing into a file pointed to by fp2 

fwrite后fflush会为我做吗?

回答

0

还有没有保证fread会给你你要求的所有字节。它可以减少,这是返回代码的用途。

您需要使用返回代码来计算发送给fwrite的信息量。

并且返回码的检查也延伸到fopen调用 - 不保证打开工作。

举例来说,下面的完整程序将尝试高达3K从一个文件复制到另一个:

#include <stdio.h> 
#include <errno.h> 

int main (void) { 
    FILE *fp1, *fp2; 
    char buff[3*1024]; 
    int bytesRead; 

    // Open both files. 

    if ((fp1 = fopen ("a.txt", "r")) == NULL) { 
     printf ("Error %d opening a.txt\n", errno); 
     return 1; 
    } 
    if ((fp2 = fopen ("b.txt", "w")) == NULL) { 
     printf ("Error %d opening b.txt\n", errno); 
     fclose (fp1); 
     return 1; 
    } 

    // Transfer only up to buffer size. 

    if ((bytesRead = fread (buff, 1, sizeof (buff), fp1)) == 0) { 
     // Check error case. 

     if (ferror (fp1)) { 
      printf ("Error reading a.txt\n"); 
      fclose (fp1); 
      fclose (fp2); 
      return 1; 
     } 
    } 

    // Attempt transfer to destination file. 

    if (fwrite (buff, 1, bytesRead, fp2) != bytesRead) { 
     printf ("Error writing b.txt\n"); 
     fclose (fp1); 
     fclose (fp2); 
     return 1; 
    } 

    // Close all files to finish up. 

    fclose (fp1); 
    fclose (fp2); 
    return 0; 
} 
+1

'fread()'* only *如果发生错误或达到文件结尾,则返回一个短项目数。没有必要重试'fread()' - 如果文件达到了,则不再有数据;并且如果发生错误,则文件位置指示符的值是不确定的。这与典型的底层低级函数(如read())形成对比,它可以*返回短读取而不会产生错误。 – caf 2012-04-13 06:01:51

3

fflush(fp2)fclose(fp2)会将挂起的缓冲字节移动到磁盘。

+0

你的意思是说,fwrite的永远是不可靠的,而不fflush或FCLOSE? – 2012-04-13 05:57:04

+0

'fwrite()'是可靠的,但默认情况下,缓冲涉及绝大多数程序使用的整体效率。如果你正在做的不需要缓冲,你可以在打开文件后使用'setbuf()'来禁用缓冲。 – wallyk 2012-04-13 05:59:04

+2

@ajaybidari:注意,如果进程干净地退出(通过从main()返回或调用exit()),所有打开的带有未写入缓冲数据的流将被刷新,并且所有打开的流将被关闭。请注意,即使使用'fflush()'或'fclose()',写入操作可能会被操作系统缓冲,因此在系统崩溃后可能不会持久,而不会调用某些特定于OS的同步功能。 – caf 2012-04-13 06:06:03