我有一些二进制文件要写入输出文件。
因此,我使用char
作为缓冲器编写了这个函数,天真地认为它可以工作。
//Opened hOutput for writing, hInput for reading
void faddf(FILE* hOutput, FILE* hInput) {
char c;
int scan;
do{
scan = fscanf(hInput, "%c", &c);
if (scan > 0)
fprintf(hOutput, "%c", c);
} while (scan > 0 && !feof(hInput));
}
执行此函数可以在开头的二进制文件中输出少量可读的char
。所以我这样试了:
void faddf(FILE* hOutput, FILE* hInput) {
void * buffer;
int scan;
buffer = malloc(sizeof(short) * 209000000);
fread(buffer, sizeof(short), 209000000, hInput);
fwrite(buffer, sizeof(short), 209000000, hOutput);
free(buffer);
}
这“有效”,但仅在文件小于我的“幻数”时才有效吗?有更好的方法吗?
答案 0 :(得分:1)
您应该避免每字节读取个字节。使用fgets()
功能代替fscanf().
当你打开彼此相邻的两个文件(输入一个/输出一个)时,你说输出文件只包含可读字符......但是你的文本编辑器可以在输入文件上显示不可读的字符吗?
答案 1 :(得分:1)
我不应该首先问这个问题,但这是我最终如何做到的:
void faddf(FILE* hOutput, FILE* hInput) {
void * buffer;
int scan,size;
size_t read;
//get the input file size
fseek(hInput, 0L, SEEK_END);
size = ftell(hInput);
fseek(hInput, 0L, SEEK_SET);
//place the get space
buffer = malloc(size);
if (buffer == NULL)exit(1);//should fail silently instead
//try to read everything to buffer
read = fread(buffer, 1, size, hInput);
//write what was read
fwrite(buffer, 1, read, hOutput);
//clean up
free(buffer);
}
答案 2 :(得分:1)
虽然您的新代码(在the answer中)比旧代码好得多,但它仍然可以进行改进和简化。
具体来说,您可以通过以块的形式复制文件来避免任何内存问题。
void faddf( FILE *fpout, FILE *fpin )
{
char buffer[4096];
size_t count;
while ( (count = fread(buffer, 1, sizeof buffer, fpin)) > 0 )
fwrite(buffer, 1, count, fpout);
}