实际上我有大量的文本格式的点数据集(例如我的文件大小为49000 KB),相同的样式每1行6个数值,第2行又有6个数字 第一个谎言:1 234 3412 4567 12 5678 第二行:2 452 1234 1233 34 3421 第三行:3 123 4532 4530 45 5643 ........................... ..
首先,我希望将此文件转换为二进制文件(dat格式),之后我想再次将其转换为文本文件(txt)。我已经编写了一些转换ascii到dat的代码,但在运行我的程序后,我得到了我的二进制(dat)文件输出,如: 升 _S™_>¥ÝƒJÂ* C_l__ ×#?|݃JÂ*C_l__Âõ=|݃J_À* C_l_ S™?§ÝƒJq½* C_l__ ×£=§ÝƒJ_®* C_l __)_?§ÝƒJö¨*C_l__Âõ<¨ÝJH¡* C_l_ ®?¨ÝƒJ¸ž* C_l ×#<©ÝƒJ)OE * C_l_ _ _©ÝƒJ{” * C? 可能这不是dat文件的正确输出,但我想将此dat文件agagin转换为ascii(txt)文件。如果任何人可以帮助编写c ++代码感谢
答案 0 :(得分: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文件。但你可以使用am十六进制查看器并找到16个字节(4位字节* 4字节用于 ints ,在32位机器中),以及这四个变量的值。
检查程序是否正常工作的另一种方法是编码将再次将数据文件转换为文本的解码器。然后你可以比较原始的和新的,并看看是否存在差异。
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;
}
如果您现在在主功能中添加对 decode()的调用,您将最终得到两个文件,data.txt(原始)和data2。 txt(目标一个)。您现在可以直观地比较它们,看看里面的数据是否相同。