消除 freads 中的缓冲区溢出 (C)

Eliminating buffer overflow in freads (C)

简单的问题,但由于要求有点奇怪。

基本上,当我读取文件使用文件 I/O 时,我试图防止缓冲区溢出,因为我正在读取缓冲区大小为 32 的文件。我觉得这应该在某个地方得到回答,但就我的生活而言,我的搜索并没有出现。

我的代码的简化版本在这里:

#include <stdio.h>                
#include <string.h>               
#define BUFFER_SIZE 32              
 
int main(int argc, char *argv[]) {
    FILE * read_file;
       
    char buffer[BUFFER_SIZE];
    read_file = fopen("test.txt","r");
    
    size_t num_rec = BUFFER_SIZE;
    while(fread(buffer, 1,num_rec, read_file) > 0) {
        printf("%s", buffer);
    }
    fclose(read_file);
    
    return 0;
}

假设我正在尝试阅读包含以下内容的 test.txt:

This is a test file. 
The file is a test. 
I am having an overflow problem.
My C is not the best.

我得到这样的输出:

This is a test file.                                                                                                                                                               
The file is a test.                                                                                                                                                                
I am having an overflow problem.                                                                                                                                                   
My C is not the best.w problem.                                                                                                                                                    
My C is not the best

我知道解决这个问题的最简单方法是一次读取 1 个字符而不是 32 个字符,但是,有没有办法在一次读取 32 个字符的同时解决这个问题?

下面保存的是fread then uses it to printf个已经读过的字符的return值,仅此而已

    size_t read_bytes;
    while((read_bytes = fread(buffer, 1,num_rec, read_file)) > 0) {
        printf("%.*s", (int)read_bytes, buffer);
    }

fread()函数读取二进制数据,不添加空字节。你需要告诉 printf() 要打印多少字节,这应该是 fread().

返回的数字
size_t nbytes;
while((nbytes = fread(buffer, 1, num_rec, read_file)) > 0)
    printf("%.*s", (int)nbytes, buffer);

注意fread()returns一个size_t,但是printf()中的.*操作需要一个int;因此转换(尽管可以将 fread() 中的值保存在 int 中并在没有转换的情况下使用它)。