我使用下面的程序从文本文件中读取并将其写入新文件,但新文件最后总是有一些缺少的内容。
#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。
答案 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)。