f在c中没有读完整个文件

时间:2014-11-30 12:50:51

标签: c buffer fread

我使用下面的程序从文本文件中读取并将其写入新文件,但新文件最后总是有一些缺少的内容。

#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>

#define CHUNKSIZE 256


int main(){

  const char *file_name = "file.txt";
  const char *new_file_name = "new_file.txt";
  struct stat b_st;
  struct stat n_b_st;
  int file_size, new_file_size;
  char buffer[CHUNKSIZE];
  FILE *fp = fopen(file_name, "rb");
  FILE *fd = fopen(new_file_name, "wb");


  while(fread(buffer, sizeof(buffer), 1, fp)){

    fwrite(buffer, sizeof(buffer), 1, fd);
    fflush(fd);
  }

  stat(file_name, (struct stat *)&b_st);
  stat(new_file_name, (struct stat *)&n_b_st);

  file_size = b_st.st_size;
  new_file_size = n_b_st.st_size;

  if(file_size == new_file_size){

    printf("Success reading and writing data");
    exit(1);
  }

  return 0;  

}    

需要注意的是,尽管我减少了CHUNKSIZE,但新文件末尾丢失的内容量减少了,最后当CHUNKSIZE减少为1时,它会给出成功消息。如何读写?完整的文件而不更改CHUNKSIZE。

2 个答案:

答案 0 :(得分:1)

while(nread = fread(buffer, 1, CHUNKSIZE, fp)){
    fwrite(buffer, 1, nread, fd);
    fflush(fd);
}

写下您读取的字节!

只有在设置大小为1时才会返回读取字节。

  

成功时,fread()fwrite()会返回读取的项目数量          书面。此数字等于仅传输的字节数          当大小为1.如果发生错误,或文件结束          到达时,返回值是短项目计数(或零)。

答案 1 :(得分:0)

你遇到的问题是你的单位尺寸太大,试试这个:

int ret;
while((ret = fread(buffer,1, sizeof(buffer), fp)) > 0){
fwrite(buffer, 1, ret, fd);

fflush(fd);}

阅读man pages for more information

您还应该检查所有程序的返回值(对于fopen和fread / fwrite)。