我有一个充满数字的文本文件(来自分子动力学输出,应该是double
类型),分为三列,数千行如下:
-11.979920 -13.987064 -0.608777
-9.174895 -13.979109 -0.809622
我想读取文件中的所有数字,将它们转换为double
类型,然后将它们保存到binary
文件中。
我知道不建议使用二进制文件,但我希望它能够测试两种文件格式的压缩算法,即文本和二进制文件。我尝试过使用Need to convert txt file into binary file in C++,但我不确定是否以整个格式转换每个数字:-11.275804或者是否正在解析每个单独的数字:-1,1,2,7,5等。< / p>
编辑:一直试图将单个双精度转换为二进制并返回,有一些问题。这是核心代码
if( std::string(argv[1]) == "-2bin") //convert to binary
{
cout << "Performing the conversion: Text -> Binary..." << endl;
std::ifstream in(argv[2]);
std::ofstream out(argv[3], std::ios::binary);
double d;
while(in >> d) {
cout << "read a double: "<< d <<endl;
out.write((char*)&d, sizeof d);
}
out.flush();
out.close();
cout << "Conversion complete!" << endl;
return 0;
}else if( std::string(argv[1]) == "-2text" ) //convert to text
{
cout << "Performing the conversion: Binary -> Text..." << endl;
std::ifstream in(argv[2], std::ios::binary);
std::ofstream out(argv[3]);
std::string s;
while(in >> s) {
cout << "read a string:" << s <<endl;
out.write((char*)&s, s.length());
}
out.flush();
out.close();
cout << "Conversion complete!" << endl;
return 0;
当只读取一个双精度数时,例如1.23456789
,读取的字符串长度为7
read a double: 1.23457
我想让它读到下一个'空格',然后转换为double-&gt; bin。 做二进制时 - &gt;文本转换一切都坏了,我不知道如何处理二进制文件并将其转换为double然后将其转换为字符串。
更新:最后我设法检查二进制转换是否与od -lF
实用程序一起使用,但是每一行都有一条奇怪的行我不知道它意味着什么,它会从第一个数字中删除零输出有两列而不是3列:
od -lF composite_of10_2.bin | more
0000000 -4600438323394026364 -4599308401772716498
-11.97992 -13.987064
0000020 -4619713441568795935 -4602017412087121980
-0.608777 -9.174895
0000040 -4599312880039595965 -4617904390634477481
-13.979109 -0.809622
这看起来是否正确转换?我该如何执行从二进制到双字符串的转换?
答案 0 :(得分:2)
在你的二进制文件中 - &gt;当您的二进制文件包含二进制“双精度”
时,您在数据中读取的文本转换为“字符串”std::string s;
while(in >> s) { ...
这将给出未定义的结果,你需要读作'double'并将值转换为字符串,这将由文本输出流本地处理
double d;
while( in.read( (char*)&d, sizeof(d) ) { //, Read the double value form the binary stream
out << d << ' '; //< Write the double value to the output stream which is in text format
}