无法从文件中读取简单的二进制整数?(C++)
Cannot read simple binary integers from file? (C++)
我的代码如下:
更新:
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char **argv)
{
ifstream r("foo.bin", ios::binary);
ofstream w("foo.bin", ios::binary);
int i;
int ints[10] = {0,1,2,3,4,5,6,8,9};
w.write((char*)&ints, sizeof(ints));
int in_ints[10];
r.read((char*)&in_ints, sizeof(in_ints));
for(i = 0;i < 10;i++) {
cout << in_ints[i] << " ";
}
cout << endl;
return 0;
}
现在,写入部分似乎是成功的,例如,运行32位长的od命令(我的系统是32位)将显示正确的序列,包括十六进制转储。
然而,阅读时,我得到了随机序列,比如不应该发生的负整数(它被拆分,大多数是零,因为我的整数很小,符号位不应该打开。)
你明白为什么我的阅读方法失败了吗,而它实际上与我的写作方法相反?
在r.read
之前尝试w.flush()
或w.close()
。问题是,当您编写它时,通常会对文本进行缓冲,而不将其保存在文件中。所以CCD_ 4的文件中没有任何实际内容。
此代码:
#include <iostream>
#include <fstream>
using namespace std;
int main() {
{
ofstream w( "foo.txt" );
int ints[10] = {0,1,2,3,4,5,6,8,9};
w.write((char*)&ints, sizeof(ints));
}
{
ifstream r( "foo.txt" );
int in_ints[10];
r.read((char*)&in_ints, sizeof(in_ints));
for( int i = 0; i < 10; i++) {
cout << in_ints[i] << " ";
}
}
}
打印:
0 1 2 3 4 5 6 8 9 0
请注意,您的初始化中缺少一些数字。
写入文件的数据不一定对其他流可见(在是否相同的过程),直到文件被关闭或至少被刷新。如果在启动程序之前文件CCD_ 5不存在,打开它进行阅读将失败(因此所有进一步的使用都将是无操作)。您的程序违反了编程:如果任何东西都可能失败,请始终检查它以前是否失败继续。你没有检查你的IO的任何结果。
我还可以补充一点,以这种方式读取和写入数据是非常非常脆弱,通常只能保证在流程;甚至使用不同版本的编译器重新编译或者不同的编译器选项可能导致数据表示更改,结果是您将无法读取写入的数据早些时候。当然,在int
阵列的情况下不太可能,只要你不改变机器架构。但在一般来说,如果将来需要重新读取数据最好避免这种技术。((char*)
是reinterpret_cast
,作为我们知道,reinterpret_cast
是一个非常强的信号,表明便携性问题。)
相关文章:
- 从二进制文件中读取整数数组
- FlatBuffers/Protobuf 中是否有支持任意 24 位有符号整数定义的可移植二进制序列化架构?
- 读取二进制文件并解释为整数
- 将较大的整数写为二进制并读回它们会产生不好的结果
- C++ 将二进制字符串转换为整数或比较 2 个字符串以查找差异数
- 将二进制编码的无符号字符转换为整数
- 将整数的二进制数据转换为浮点数
- 将非数字字符串存储为二进制整数
- 如何在 gdb 中查看C++整数的二进制内容?
- 添加两个二进制数(整数数组)
- 将二进制转换为负整数
- 编译器C++如何在二进制代码中表示整数
- 为什么C++标准指定有符号整数在具有混合符号的二进制操作中强制转换为无符号整数
- 读取 64 位整数二进制文件
- 我正在尝试读取一个包含字符串和整数的二进制文件..并打印出与字符串对应的整数
- 将整数转换为二进制字符串
- 将fortran生成的二进制文件读取到C++中的带符号整数数组中
- 将从二进制文件读取的字符串转换为整数
- C++ - 将字符串二进制链转换为整数二进制链
- 将字符串转换为整数(二进制等效)