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 个,但也包含第一个缓冲区的后半部分。这听起来可能令人困惑,所以我将在下面展示一个示例。
我的文件是这样的
aaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccc
有 25 个 a、25 个 b 和 25 个 c。
如果我打印每个缓冲区,输出将是这样的
aaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbb
ccccccccccccccccccccccccbbbbbbbbbbbbbbbbbbbbbbbbbb
我假设它只是垃圾值,这就是为什么我试图在每次迭代中将缓冲区 strcpy()
设置为空。为什么会这样?
谢谢。
最佳答案
fread()
不会将空终止符附加到读取缓冲区,但您对 strlen()
的使用是预期的。正如您所指出的,第二个 fread()
读取的字符比第一个 fread()
读取的字符少,并且它不会覆盖缓冲区中已有的剩余数据。
fread()
返回实际读取的条目数,你需要使用那个值,eg:
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);
关于c - 为什么我的缓冲区中的数据包含垃圾值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36096840/