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

标签 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 个,但也包含第一个缓冲区的后半部分。这听起来可能令人困惑,所以我将在下面展示一个示例。

我的文件是这样的

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/

相关文章:

C语言: Search text file for a "var" and store the next string as the value

c - while() 循环未按预期工作。可能是什么原因?

c - 使用 fscanf 在 c 中读取文件

memory - 交换空间上的缓存有什么意义?

C - 直接从键盘缓冲区读取

java - JAVA中从服务器套接字缓冲区接收时消除半字符串

c - 当我尝试以天真的方式实现时,反转c中字符串中的单词

C 多行宏 : do/while(0) vs scope block

C|如何检查我的输入缓冲区(标准输入)是否为空?

Android - 发送 DatagramSocket 最大缓冲区大小