从c ++二进制文件返回错误的值

时间:2015-04-29 20:28:41

标签: c++ file-io binaryfiles fread stdio

我正在尝试使用stdio.h读取和写入一些布尔网格到文件中。用户输入一个数字nx(通常为1到10),程序会生成nxceil(nx / 2)布尔网格列表(ceil(nx / 2)ny )。网格本身存储在__int64 s中,因此此网格(f为false且T为true):

ffTT
fTfT

将是172(10101100)。

网格的结束列表输出到二进制文件。

我的代码:

std::vector<__int64> grids;

...

FILE *cFile;
if (fopen_s(&cFile, ("grid_" + std::to_string(nx) + "_c.bin").c_str(), "wb") != 0) return;

for (int i = 0; i < grids.size(); i++) {
    fwrite(&grids[i], (int) ceil((nx * ny) / 8), 1, cFile);
}

fclose(cFile);

这部分工作正常。

然而,当我尝试从文件中读取时,无论大小如何,所有网格都是-858993460,尽管它可以获得正确的网格数量。我的阅读代码:

FILE *cFile;
if (fopen_s(&cFile, ("grid_" + std::to_string(nx) + "_c.bin").c_str(), "rb") != 0) return;

fseek(cFile, 0, SEEK_END);
long size = ftell(cFile);

int grids = size / ((nx * ny) / 8);

for (int n = 0; n < shapes; n++) {
    __int64 data;
    fread(&data, (int) ceil((nx * ny) / 8), 1, cFile);
    printf("%i\n", data);
}

fclose(cFile);

我做错了什么?

如果您需要更多信息可以回答,请发表评论,我会将其提供给您。

提前致谢!

1 个答案:

答案 0 :(得分:3)

<强>问题

问题是您使用以下方法将FILE*移动到文件的末尾:

fseek(cFile, 0, SEEK_END);

然后,您试图在不返回文件开头的情况下读取数据。

您没有检查返回值:

fread(&data, (int) ceil((nx * ny) / 8), 1, cFile);

检查读取是否成功。

<强>修正

添加行

fseek(cFile, 0, SEEK_SET);

快退文件。

始终检查阅读操作的返回值。

if ( fread(&data, (int) ceil((nx * ny) / 8), 1, cFile) == 1 )
{
   // Successful read.
   // Use the data
}