在C中,我将文件Data_A的全部内容读入使用malloc()创建的缓冲区中。该文件包含1000个随机整数,范围为5到1000.
当我读取文件时,newLen变量(见下文)显示读取大小为1001.当我如下所示迭代它时,我得到有效数字(每个数字正确对应文件中的内容),直到它达到250,返回负数。显然它只从1000个整数的文件中读取251个整数,但我不知道为什么。这是代码:
char FileA [] = "C:/C_Projects/Data_A";
int *buffer1 = NULL;
FILE *pRead;
FILE *fp = fopen(FileA, "rb");
FILE *ptr_test;
fseek(fp, 0L, SEEK_END);
long bufsize = ftell(fp);
buffer1 = malloc(bufsize + 1);
fseek(fp, 0, SEEK_SET);
int nums_to_read = bufsize / 4;
size_t newLen = fread(buffer1, 1, nums_to_read, fp);
buffer1[++newLen] = '\0';
fclose(fp);
// Iterate
int i;
int abc;
int bcd;
for (i = 0; i < bufsize / 4; i++)
{
abc = buffer1[i];
if (abc < 0)
{
bcd = 0;
}
if (i >= 200)
{
bcd = 0;
}
}
正如我所说,文件中的所有数字都是5到1000之间的正数;没有零或负数。所以我不明白为什么它不能读取所有1000个整数。变量bufsize确认缓冲区是4000字节。
任何想法都将受到最高的赞赏。
答案 0 :(得分:1)
代码有各种各样的问题和弱点,最大的是scant读。 @Marcus Müller @Retired Ninja
1元素大小太小
// fread(buffer1, 1, nums_to_read, fp);
// read nums_to_read elements
// Each elements has the size of `sizeof buffer[0]`
fread(buffer1, sizeof buffer[0], nums_to_read, fp);
代码中的其他改进。 Handle_Error()
是要编写的错误处理代码。
char FileA [] = "C:/C_Projects/Data_A";
// FILE *pRead; // not used here
FILE *fp = fopen(FileA, "rb");
if (fp == NULL) Handle_Error();
// FILE *ptr_test; // not used here
fseek(fp, 0, SEEK_END);
long bufsize = ftell(fp);
if (bufsize == -1) Handle_Error();
int *buffer1 = malloc(bufsize + sizeof *buffer1);
if (buffer1 == NULL) Handle_Error();
// fseek(fp, 0, SEEK_SET);
rewind(fp); // rewind is sufficient and more clear
// int nums_to_read = bufsize / 4;
size_t nums_to_read = (size_t) bufsize / sizeof *buffer1;
size_t newLen = fread(buffer1, sizeof buffer[0], nums_to_read, fp);
if (newLen != nums_to_read) Handle_Error();
// buffer1[++newLen] = '\0';
buffer1[newLen] = 0;
fclose(fp);
int bcd = 1; // likely should have a default value
// Iterate
// for (int i = 0; i < (size_t) bufsize / 4; i++) {
for (size_t i = 0; i < newLen; i++) {
int abc = buffer1[i];
if (abc < 0) {
bcd = 0;
}
if (i >= 200) {
bcd = 0;
}
}
答案 1 :(得分:0)
我在上面的最终评论中回答了这个问题,但为了使这篇文章看起来像是一个已回答的问题,我也在这里发帖。将fread行更改为size_t newLen = fread(buffer1, sizeof(int), nums_to_read, fp);
更正了问题,现在它读取整个文件。
非常感谢@Retired Ninja以及回复此问题的其他人。
答案 2 :(得分:0)
错误在这里
int nums_to_read = bufsize / 4;
size_t newLen = fread(buffer1, 1, nums_to_read, fp);
fread的第二个参数是要读取的元素的大小。第三是阅读多少。看起来你的意图是读取4个字节的数字(因为你将长度除以4)。所以你应该说
int nums_to_read = bufsize / 4;
size_t newLen = fread(buffer1, 4, nums_to_read, fp);
跳过整个问题 - 是你的4个字节。并且该文件真的是原始的4字节整数。