2011-03-02 228 views
1

其实我有以文本格式为例(最小49000 KB我的文件大小)的巨大点数据集,相同样式每1行6个数值,第二行再次有6个数字 第一个谎言:1 234 3412 4567 12 5678 第二行:2 452 1234 1233 34 3421 第三行:3 123 4532 4530 45 5643 ........................... ..需要将二进制文件转换为Txt文件

首先,我想转换此文件转换为二进制文件(数据格式),之后我想再次将其转换为文本文件(txt)。我已经写了一些代码转换ASCII到DAT,但运行我的程序后,我得到了我的二进制(DAT)文件输出: l ____ ݃J_À* C_l_ S™?§ÝƒJq½* C_l__ ×£=§ÝƒJ_®* C_L __)_?§ÝƒJö¨*C_l__Âõ<¨ÝƒJH¡* C_l_ ®?¨ÝƒJ¸ž* C_L ×#<©这个数据文件可能不是正确的输出,但是我想把这个dat文件agagin转换成ascii(txt)文件。如果任何人可以帮助写这个C++代码谢谢

+1

这个二进制文件的格式是否知道?你想将写入的字节转换为可读格式吗? [Base64编码](http://en.wikipedia.org/wiki/Base64)适合你吗? – birryree 2011-03-02 22:49:22

+0

是这个二进制文件的格式是.dat,我想将它转换为我原来的文本文件:数值在行 – aki 2011-03-02 23:00:16

回答

2

如果你想使你的二进制格式的正面和反面,你应该使用十六进制查看器。有数千人在那里,只需选择一个。

说你从你的文本文件中读取四个数字:现在

int code() 
{ 
    int a, b, c, d; 
    ifstream fin("data.txt"); 
    ofstream fout("data.dat", ios::binary); 

    fin >> a >> b >> c >> d; 

    fout.write(&a, sizeof(int)); 
    fout.write(&b, sizeof(int)); 
    fout.write(&c, sizeof(int)); 
    fout.write(&d, sizeof(int)); 
} 

int main() 
{ 
    code(); 
} 

,你将有一个Data.dat文件,你基本上就没有意义在文本编辑器。但是,您可以使用十六进制查看器并使用这四个变量的值查找16个字节(对于,输入为,在32位机器中为4个字节* 4个字节)。

另一种检查程序是否正常工作的方法是编码将数据文件再次转换为文本的解码器。然后你可以比较原来的和新的,看看是否有差异。

int decode() 
{ 
    int a, b, c, d; 
    ifstream fin("data.dat", ios::binary); 
    ofstream fout("data2.txt"); 

    fin.read(&a, sizeof(int)); 
    fin.read(&b, sizeof(int)); 
    fin.read(&c, sizeof(int)); 
    fin.read(&d, sizeof(int)); 

    fout << a << ' ' << b << ' ' << c << ' ' << d; 

} 

如果你现在在你的主要函数添加调用解码(),你将最终获得两个文件,data.txt中(原件)和data2.txt(目标之一) 。您现在可以直观地比较它们,并查看内部数据是否是同一个数据。

+0

我didn'i得到它给我例pls。 – aki 2011-03-02 23:01:37

+0

为了更准确地回复您的问题,我已经扩展了我的答案。希望这可以帮助。 – Baltasarq 2011-03-03 09:05:13

+0

如果将其扩展为6个数字并将while循环放入以处理多行/ 6组值,则基本上已编写完整的解决方案。值得指出的是,如果已知该数字落在16位值所覆盖的较小范围内,则可以使用“int16_t”(来自cstdint,如果使用Windoze,则为__int32),则会产生较小的二进制文件。 – 2011-03-03 09:18:28