我有一个二进制文件,其中包含double类型的数字
示例输入文件可在此处获取:www.bobdanani.net/download/A.0.0
我想阅读文件并在其中打印数字。
这就是我所做的:
char* buffer;
int length;
string filename = "A.0.0";
ifs.open (filename.c_str(), ios::in | ios::binary);
// get length of file:
ifs.seekg (0, ios::end);
length = ifs.tellg();
ifs.seekg (0, ios::beg);
// allocate memory:
buffer = new char [length];
// read data as a block:
ifs.read (buffer,length);
ifs.close();
cout.write (buffer,length);
cout << buffer << endl;
delete[] buffer;
我还试图在打印数字时使用类型转换加倍,但我有奇怪的字符。做这个的最好方式是什么?我需要这个二进制文件的数据作为并行程序函数的输入。但这超出了这个问题的范围。
答案 0 :(得分:3)
虽然我可能错了,因为你说数字是由标签/空格分隔的,我愿意这是实际上是ASCII数据,而不是原始二进制数据。因此,使用浮点值的最佳方法是使用operator>>
对象上的ifstream
,然后将其推送到double
。这将自动将输入值转换为double,其中 - 您所做的只会复制组成浮点值的字符字节,但本身不是浮点值。另外,如果你试图像字符串一样输出你的缓冲区,你还没有显式地将其终止,所以它会继续读取堆栈,直到它遇到空终止符或者由于访问内存而出现分段错误操作系统不允许您访问堆栈顶部。但无论哪种方式,最终,您的缓冲区都不会代表double
数据类型。
所以你会有类似的东西:
double my_double_val;
ifs.open (filename.c_str());
if (ifs)
{
ifs >> my_double_val;
}
else
{
cerr << "Error opening file" << endl;
}
ifs.close();
cout << "Double floating point value: " << my_double_val << endl;
答案 1 :(得分:0)
cout.write (buffer,length);
不要这样做!以上是将二进制数据转储到标准输出。
cout << buffer << endl;
也不要这样做!上面将二进制数据转储到标准输出恰好为零的第一个字节。如果没有这样的字节,这将继续超过缓冲区的末尾(所以未定义的行为)。
如果缓冲区真的包含双打,只有双打,你可以做一些令人讨厌的事情,如
double * dbuf = reinterpret_cast<double*>(buffer);
int dlength = length / sizeof(double);
答案 2 :(得分:0)
在C ++中使用系统函数调用(假设您使用的是unix OS)并传递'od -e filename'
作为系统函数调用的参数。然后,您可以轻松地管理它返回的值并读取它们。这是一种方法。当然还有很多其他方法可以做到这一点。