C函数fread()不读取整个文件

时间:2018-01-16 22:31:32

标签: c malloc

在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字节。

任何想法都将受到最高的赞赏。

3 个答案:

答案 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字节整数。