[英]Read file block by block in C
我想完全按原样将file1的内容复制到file2(保留空格和换行符)。 我特意想一次将这些内容复制一小块字符(这是一个较大项目的一小段,所以请耐心等待)。
我尝试过以下方法:
#include <stdio.h>
#include <stdlib.h>
#define MAX 5
int main(int argc, char *argv[]) {
FILE *fin, *fout;
char buffer[MAX];
int length;
char c;
if((fin=fopen(argv[1], "r")) == NULL){
perror("fopen");
exit(EXIT_FAILURE);
}
if((fout=fopen(argv[2], "w")) == NULL){
perror("fopen");
exit(EXIT_FAILURE);
}
while(1){
length = 0;
while((c = fgetc(fin)) != EOF && length < MAX){
buffer[length++] = (char) c;
}
if(length == 0){
break;
}
fprintf(fout, "%s", buffer);
}
fclose(fout);
fclose(fin);
}
但是,这会导致错误输出到我的文件2。 任何输入将不胜感激。
您的缓冲区不是零终止的。 使用fwrite而不是fprintf:
fwrite(buffer, 1, length, fout);
你也应该检查错误。 因此,将fwrite
返回码与length
进行比较,如果不同,则重试写入剩余字节(如果为正)或通过perror("fwrite")
打印相应的错误消息(如果返回码为负)。
另外,您可以考虑以二进制模式打开文件,这会导致窗口不同,即将"rb"
和"wb"
传递给fopen
。
最后但并非最不重要的是,不要一次循环并获取一个字符,而是考虑使用fread
:
length = fread(buffer, 1, MAX, fin);
这是一个简单的例子。(没有错误检查)
您应该使用fwrite(),因为您要写入文件的字符串不是“以null结尾”。 另请注意,使用fopen()指定“b”模式,这意味着您要将文件作为二进制文件打开。
#include <stdio.h>
#include <stdlib.h>
#define MAX 5
#define FILE_BLOCK_SIZE 50
int _tmain(int argc, _TCHAR* argv[])
{
FILE *fin, *fout;
unsigned char *BufContent = NULL;
BufContent = (unsigned char*) malloc(FILE_BLOCK_SIZE);
size_t BufContentSz;
if((fin=fopen("E:\\aa.txt", "rb")) == NULL){
perror("fopen");
exit(EXIT_FAILURE);
}
if((fout=fopen("E:\\bb.txt", "wb")) == NULL){
perror("fopen");
exit(EXIT_FAILURE);
}
while ((BufContentSz = fread(BufContent, sizeof(unsigned char), FILE_BLOCK_SIZE, fin)) > 0)
{
fwrite(BufContent, sizeof(unsigned char), BufContentSz, fout);
}
fclose(fout);
fclose(fin);
delete BufContent;
return 0;
}
首先,更改char buffer[MAX];
到int buffer[MAX];
和char c;
到int c;
,对于char
可以是signed char
或unsigned char
,具体取决于您的实现。 在后一种情况下, c = EOF
会给c
一个大的正数(无论如何都是无符号的),所以循环永远不会结束。 int
足够大,可以容纳所有字符和EOF。
然后,改变你的
fprintf(fout, "%s", buffer);
至
fwrite(buffer, 1, length, four);
这是因为fprintf(fout, "%s", buffer);
调用C风格的字符串,结尾为'\\0'
,但您的buffer
不是零终止。 结果,程序将继续复制堆栈中的东西,直到满足'\\0'
,在file2中留下大量垃圾。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.