消除 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
中并在没有转换的情况下使用它)。
简单的问题,但由于要求有点奇怪。
基本上,当我读取文件使用文件 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
中并在没有转换的情况下使用它)。