从 C++ 二进制文件中读取返回错误值
fread from c++ binary file returning wrong value
我正在尝试使用 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("%i\n", data);
}
fclose(cFile);
我做错了什么?
如果您需要更多信息来回答,请发表评论,我会给您。
提前致谢!
我认为您使用 fwrite
和 fread
的方式很奇怪。请
fwrite(&gris[i], sizeof(__int64), 1, cFile);
转储和
fread(&data, sizeof(__int64), 1, cFile);
用于恢复。
问题
问题是您正在使用以下方法将 FILE*
移动到文件末尾:
fseek(cFile, 0, SEEK_END);
然后,您试图在不返回文件开头的情况下读取数据。
您没有检查 returned 值:
fread(&data, (int) ceil((nx * ny) / 8), 1, cFile);
查看读取是否成功
修复
添加行
fseek(cFile, 0, SEEK_SET);
倒回文件。
始终检查读取操作的 return 值。
if ( fread(&data, (int) ceil((nx * ny) / 8), 1, cFile) == 1 )
{
// Successful read.
// Use the data
}
我正在尝试使用 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("%i\n", data);
}
fclose(cFile);
我做错了什么?
如果您需要更多信息来回答,请发表评论,我会给您。
提前致谢!
我认为您使用 fwrite
和 fread
的方式很奇怪。请
fwrite(&gris[i], sizeof(__int64), 1, cFile);
转储和
fread(&data, sizeof(__int64), 1, cFile);
用于恢复。
问题
问题是您正在使用以下方法将 FILE*
移动到文件末尾:
fseek(cFile, 0, SEEK_END);
然后,您试图在不返回文件开头的情况下读取数据。
您没有检查 returned 值:
fread(&data, (int) ceil((nx * ny) / 8), 1, cFile);
查看读取是否成功
修复
添加行
fseek(cFile, 0, SEEK_SET);
倒回文件。
始终检查读取操作的 return 值。
if ( fread(&data, (int) ceil((nx * ny) / 8), 1, cFile) == 1 )
{
// Successful read.
// Use the data
}