从返回错误值的 C++ 二进制文件中读取

fread from c++ binary file returning wrong value

本文关键字:二进制文件 读取 C++ 返回 错误      更新时间:2023-10-16

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

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("%in", data);
}
fclose(cFile);

我做错了什么?


如果您需要更多信息来回答,请发表评论,我会给您。

提前感谢!

问题

问题是您使用以下命令将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
}
<</div> div class="answers">我认为

您正在以奇怪的方式使用fwritefread。请做

 fwrite(&gris[i], sizeof(__int64), 1, cFile);

用于转储和

 fread(&data, sizeof(__int64), 1, cFile);

用于恢复。