从返回错误值的 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("%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">我认为您正在以奇怪的方式使用fwrite
和fread
。请做
fwrite(&gris[i], sizeof(__int64), 1, cFile);
用于转储和
fread(&data, sizeof(__int64), 1, cFile);
用于恢复。
相关文章:
- 如何在 c++ 中将二进制文件读取为字符串
- 从二进制文件读取到数组:前面的任意数字
- 提升二进制文件读取错误不支持的版本
- 无法将二进制文件读取到 std::vector<std::byte> 中C++
- 提升序列化在从二进制文件读取时引发异常
- 从二进制文件 C++ 读取的字符串数组写入
- 将二进制文件读取到 std::vector<bool>
- 将fortran生成的二进制文件读取到C++中的带符号整数数组中
- 将从二进制文件读取的字符串转换为整数
- 从/到C 的二进制文件读取和写作整数
- 通过将结构信息从二进制文件读取到数组中,然后返回到文件C
- 将 int 的二进制文件读取到字符串 c++
- 将结构从二进制文件读取到链表,导致无限循环
- 将二进制文件读取到向量元素的地址中
- c++从二进制文件读取/写入类
- Python:将二进制文件读取到一个结构中,然后拆包
- 从二进制文件读取/写入十六进制字节
- 简单的 C++ 二进制文件读取
- 从二进制文件 c++ 读取 16 位整数
- 如何优化c++二进制文件读取