我有一个txt文件,数字如541399.531 261032.266 16.660(第一行) 541400.288 261032.284 16.642(第2行)........数百点。我想将此文件转换为二进制格式。任何人都可以帮助我吗?
答案 0 :(得分:7)
我建议避免将二进制表示写入文件几百或几千点。这称为微优化,开发时间超过了可执行文件性能的任何增益。
在当前的计算中,大多数平台支持巨大的(千兆字节)文件大小,并且计算机具有兆字节或千兆字节的内存供程序使用。因此,与开发周期中的其他瓶颈相比,以二进制形式写入以节省空间(文件大小或内存大小)并没有获得任何显着的优势。
从文件加载二进制表示比转换文本表示更有效的想法是正确的。但是,大多数处理器可以比读取二进制数据更快地转换ASCII转换。摘要:删除转换所获得的时间被更大的时间消费者(例如文件I / O和上下文切换)所掩盖。
与二进制表示相比,更多应用程序可以处理浮点数的文本表示。通过文本表示,可以在电子表格,文字处理器和分析工具中轻松使用数据。包含二进制表示的文件需要更多工作。您最后一次尝试将二进制浮点数文件读入电子表格时是什么时候?不要低估数据文件的未来潜力。
更改数据表示是一种优化形式。优化规则(按重要性顺序)是:
答案 1 :(得分:3)
首先,不要这样做。您几乎肯定不需要以二进制格式存储数据。以文本格式存储数据有许多优点。如果您有令人信服的理由以二进制格式存储它们,请重新考虑您的理由。
但是,你问过怎么做,而不是你应该这样做。方法如下:
#include <iostream>
#include <fstream>
int main()
{
std::ifstream in("in.txt");
std::ofstream out("out.bin", std::ios::binary);
double d;
while(in >> d) {
out.write((char*)&d, sizeof d);
}
}
请注意,这并未解决机器类型之间的任何可移植性问题。你可能必须自己解决这个问题。 (我会给你一个提示:解决二进制格式可移植性问题的最佳方法是不要使用二进制格式。)
答案 2 :(得分:2)
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
char buffer;
ifstream in("text.txt");
ofstream out("binaryfile.bin", ios::out|ios::binary);
int nums[3];
while (!in.eof())
{
in >> nums[0] >> nums[1] >> nums[2];
out.write(reinterpret_cast<const char*>(nums), 3*sizeof(int));
}
return 0;
}
答案 3 :(得分:1)
在C ++中,只需打开文件进行读取,然后将其作为二进制文件复制到另一个文件中。
FILE *pTextFile, *pBinaryFile;
char buffer;
pTextFile = fopen("textfile.txt", "r");
pBinaryFile = fopen("binaryfile.bin", "wb");
while (!pTextFile(EOF))
{
fread(buffer, 1, 1, pTextFile);
fwrite(buffer, 1, 1, pBinaryFile);
}
fclose(pTextFile);
fclose(pBinaryFile);
答案 4 :(得分:1)
这是你可能想要做的。
一些示例代码(未经测试):
ifstream ifile("file1.txt");
ofstream ofile("file2.txt", ios::binary);
string line;
while(!ifile.eof()) {
getline(ifile, line);
ofile.write(line.c_str(), line.length);
}
HTH,
斯利拉姆
答案 5 :(得分:0)
看看std :: ifstream和std :: ofstream。它们可用于读取值和写出值。
答案 6 :(得分:0)
查找stl类istringstream和ofstream。第一个自动将字符串转换为双精度数,第二个有二进制文件输出。在示例中,instream是一个istringstream,os是一个ofstream,后者以正确的模式打开(ios_base :: binary | ios_base :: out)。
while (getline(cin, s)) {
instream.clear(); // Reset from possible previous errors.
instream.str(s); // Use s as source of input.
if (instream >> myDouble)
os << myDouble;
}
答案 7 :(得分:0)
有binmake个开源C ++工具,允许将文本数据转换为二进制数据。 它目前管理多个数字表示和原始文本(hexa,octal,floats ..)。
我认为在这里提及它很有意思,因为标题处理文本到C ++中的二进制文件 binmake 可以做什么。
它可以用作独立的二进制文件,但也包含在C ++代码中。
使用stdin
/ stdout
:
$ echo '32 decimal 32 %x61 61' | ./binmake | hexdump -C
00000000 32 20 61 3d |2 a=|
00000004
使用文件:
$ ./binmake exemple.txt exemple.bin
(见下面的示例视图)
有一些使用示例:
#include <fstream>
#include "BinStream.h"
using namespace std;
using namespace BS;
int main()
{
BinStream bin;
bin << "'hello world!'"
<< "00112233"
<< "big-endian"
<< "00112233";
ofstream f("test.bin");
bin >> f;
return 0;
}
或者
#include <fstream>
#include "BinStream.h"
using namespace std;
int main()
{
BS::BinStream bin;
ifstream inf("example.txt");
ofstream ouf("example.bin");
bin << inf >> ouf;
return 0;
}
或者
#include <iostream>
#include "BinStream.h"
using namespace std;
using namespace BS;
int main()
{
BinStream bin;
cin >> bin;
cout << bin;
return 0;
}
档案exemple.txt
:
# an exemple of file description of binary data to generate
# set endianess to big-endian
big-endian
# default number is hexadecimal
00112233
# man can explicit a number type: %b means binary number
%b0100110111100000
# change endianess to little-endian
little-endian
# if no explicit, use default
44556677
# bytes are not concerned by endianess
88 99 aa bb
# change default to decimal
decimal
# following number is now decimal
0123
# strings are delimited by " or '
"this is some raw string"
# explicit hexa number starts with %x
%xff
生成的二进制输出:
$ ./binmake exemple.txt | hexdump -C
00000000 00 11 22 33 4d e0 77 66 55 44 88 99 aa bb 7b 74 |.."3M.wfUD....{t|
00000010 68 69 73 20 69 73 20 73 6f 6d 65 20 72 61 77 20 |his is some raw |
00000020 73 74 72 69 6e 67 ff |string.|
00000027