【发布时间】:2017-11-28 04:22:17
【问题描述】:
代码如下:
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *f, *fp;
char buff[512];
int buff_size;
int bytes;
fp = fopen("File.txt", "rb");
if (fp == NULL) {
printf("Cannot Open Source File!\n");
exit(1);
}
f = fopen("append.txt", "ab+");
if (f == NULL) {
printf("Cannot Open Target File!\n");
fclose(fp);
exit(1);
}
buff_size = sizeof(buff);
while (bytes = fread(&buff, buff_size, 1, fp) > 0) {
if (bytes > 0)
fwrite(&buff, buff_size, 1, f);
else
break;
printf("Appending...\n\n");
}
rewind(f);
while (bytes = fread(&buff, buff_size, 1, f) > 0)
if (bytes > 0)
printf("%s", buff);
fclose(fp);
fclose(f);
}
所以,它碰巧没有输出任何东西,当我检查文件“append.txt”时,它也不包含任何东西。 请注意,源文件“File.txt”不为空。 谁能告诉我它有什么问题?
编辑:
我通过将buff_size 替换为strlen(buff) 解决了这个问题,如下所示:
bytes = fread(&buff, strlen(buff), 1, f) > 0 和 fwrite() 和第二个 fread() 相同。
有人能解释一下为什么会这样吗?
【问题讨论】:
-
你的编译器是否给你任何关于将
&buff传递给fread()和fwrite()的警告? -
@FelixPalmen 不,它没有
-
while( bytes = fread(&buff, buff_size, 1, fp) > 0 )行没有按照您的意愿进行操作 - 您缺少while((bytes = fread(&buff, buff_size, 1, fp)) > 0)中的括号。您还需要反转 count 和 size 参数 - 您会在文件末尾得到一个简短的读取,该文件的长度不是 512 字节的精确倍数,但您不会知道这些字节。 -
你的“修复”是可怕错误的。
-
"有人能解释一下为什么会这样吗?" -- 因为 未定义的行为 是未定义的。 C 不是一种通过反复试验进行编码的语言。
标签: c file file-io fwrite fread