char buffer[51];
FILE *file;
file = fopen("...", "r");
while (fread(buffer, sizeof(char), sizeof(buffer) - 1, file) > 0) {
buffer[strlen(buffer)] = '\0';
printf("%s\n", buffer);
strcpy(buffer, "");
}
我们说我的文件包含75个字符。它会将前50个字符正确放入缓冲区。但当它转到最后25个时,缓冲区将包含那些25,但也包含第一个缓冲区的后半部分。这可能听起来令人困惑,所以我将在下面展示一个例子。
我的文件看起来像这样
aaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccc
有25个人,25个人,25个人。
如果我打印每个缓冲区,输出将是这样的
aaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccccccbbbbbbbbbbbbbbbbbbbbbbbbb
我认为它只是垃圾值,这就是为什么我在每次迭代中尝试strcpy()
缓冲区为空的原因。为什么会这样?
谢谢。
答案 0 :(得分:2)
fread()
不会将空终止符附加到读取缓冲区,但是使用strlen()
期望这样做。如您所述,第二个fread()
读取的字符少于第一个fread()
所做的字符,并且它不会覆盖缓冲区中已有的剩余数据。
fread()
返回实际读取的项目数,您需要使用该值,例如:
char buffer[51];
FILE *file;
int numRead;
file = fopen("...", "r");
do {
numRead = fread(buffer, sizeof(char), sizeof(buffer) - 1, file);
if (numRead < 1) break;
buffer[numRead] = '\0';
printf("%s\n", buffer);
}
while (1);
或者:
char buffer[51];
FILE *file;
int numRead;
file = fopen("...", "r");
do {
numRead = fread(buffer, sizeof(char), sizeof(buffer) - 1, file);
if (numRead < 1) break;
printf("%.*s\n", numRead, buffer);
}
while (1);