读/写长值到二进制文件
C++ Reading/writing long values to binary file
本文关键字:二进制文件 更新时间:2023-10-16
我正在尝试使用fstream读取和写入一个长数组到二进制文件。我将数组定义如下:
#define MAX_SUB_BUCKETS 27
unsigned long origin[MAX_SUB_BUCKETS];
unsigned long nextAvail[MAX_SUB_BUCKETS];
fstream fh;
我打开文件并尝试以下操作:
fh.open(fileName.c_str(), fstream::in | fstream::out | fstream::binary);
if (fh.fail()) {
// create new file here and write all zeroes to it (plus header)
} else {
fh.seekg (0, ios::beg);
for (i=0;i<MAX_SUB_BUCKETS;i++) {
fh.read(origin[i],sizeof(long));
}
for (i=0;i<MAX_SUB_BUCKETS;i++) {
fh.read (nextAvail[i],sizeof(long));
}
}
编译器报错如下:
tld.hh:39: error: invalid conversion from 'long unsigned int' to 'char*'
tld.hh:39: error: initializing argument 1 of 'std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::read(_CharT*, std::streamsize) [with _CharT = char, _Traits = std::char_traits<char>]'
tld.hh:42: error: invalid conversion from 'long unsigned int' to 'char*'
tld.hh:42: error: initializing argument 1 of 'std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::read(_CharT*, std::streamsize) [with _CharT = char, _Traits = std::char_traits<char>]'
tld.hh:45: error: invalid conversion from 'void*' to 'char*'
tld.hh:45: error: initializing argument 1 of 'std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::read(_CharT*, std::streamsize) [with _CharT = char, _Traits = std::char_traits<char>]'
第39行是第一个fh.read()调用。不知道我在这里做错了什么(除了我对这些事情缺乏基本的了解)。我也确信可能有一种方法可以在单个语句中读取整个原始数组或nextAvail,而不是循环。
从错误中,看起来您正在尝试在流上对char
s进行操作的read
与unsigned long
s。您可以尝试这样做:
fh.read( reinterpret_cast< char* >( &origin[i] ), sizeof( long ) );
由于二进制文件是字节数组,因此需要编写一些例程,将希望存储在文件中的数据转换为某种特定格式的字节数组。要将它们读回来,需要编写一个例程,从文件中读取字节数组,并将其转换为您想要的任何形式。
本质上,您需要编写序列化(结构化数据到一堆字节)和反序列化(一堆字节到结构化数据)例程。您可能希望使用XML或JSON(甚至是原始文本)这样的格式,因为它们非常容易理解,并且可以从这些格式转换为或转换为这些格式的库广泛可用。
相关文章:
- 正在读取二进制文件(is_open)
- 在C++中将类(带有Vector成员)保存为二进制文件
- 如何从二进制文件中读取字符串
- 保存/加载大量短数组到二进制文件
- 从二进制文件中读取整数数组
- Android 在编译二进制文件时重建静态库
- 在 C++ 中将双精度变量写入二进制文件
- clang 的 libFuzzer 可以在同一二进制文件中测试超过 1 个 API 吗?
- C++:实际上不是从二进制文件中读取
- 如何从二进制文件中的给定符号中获取调用程序图
- 将内部带有矢量的结构保存/读取到二进制文件中
- 编译多个C++文件.调用二进制文件以运行代码
- 如何使用位字段将数据从二进制文件复制到结构中?
- uint8_t同一二进制文件的不同十进制值
- C++单个生成文件多个二进制文件
- 尝试将数字写入二进制文件时引发异常
- C++中读/写二进制文件
- 如何忽略某些二进制文件的执行?
- 对在不同二进制文件中创建的对象文件的依赖关系
- 我的 SDL2 程序需要哪些二进制文件,以便它在另一台未安装 SDL2 的计算机中工作