为什么缓冲区中的数据包含垃圾值?

时间:2016-03-19 01:33:43

标签: c buffer

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()缓冲区为空的原因。为什么会这样?

谢谢。

1 个答案:

答案 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);