如何将带有数字的文本文件转换为二进制文件?
问题描述:
所以我做了一个程序,用ifstream打开一个文本文件。现在我想让它以二进制形式输出这个文件。我试过ofstream和使用.write(),但当我做程序崩溃。当我在网上看到使用.write()时我正确地设置了它,但我没有看到任何人与我一起工作。有人有解决这个问题吗?另外,我不知道为什么'InputFile'和'OutputFile'都像这样突出显示蓝色。如何将带有数字的文本文件转换为二进制文件?
#include <iostream>
#include <fstream>
#include <string>
#include <bitset>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int main(int argc, char* argv[])
{
if (argc < 2)
{
cout << "Error 1";
return 0;
}
else
{
int WIDTH, HEIGHT;
ifstream InputFile;
InputFile.open(argv[1], ios::in);
ofstream OutputFile;
OutputFile.open("OUTPUT.raw", ios::binary | ios::app);
cout << "Enter Width" << endl;
WIDTH = cin.get();
HEIGHT = WIDTH;
for (int x = 0; x < WIDTH; x++)
{
for (int y = 0; y < HEIGHT; y++)
{
OutputFile.write((char*)InputFile.get(), sizeof(InputFile));
}
}
}
//cout << bitset<8>(txt[i]);
return 0;
};
答
OutputFile.write((char*)InputFile.get(), sizeof(InputFile));
首先,istream::get()
提取从流中的一个字符并返回其浇铸到一个整数值。结果是一个临时的,你将其转换为char指针!它编译,因为C风格的演员基本上告诉编译器“shoosh,我知道我在做什么!”,但它肯定会在运行时做奇怪的事情。您需要获得某个对象的地址,然后在其中存储要写入的值,然后投射该地址。
第二件事sizeof(InputFile)
返回管理文件流的类的ifstream
大小。这与流的缓冲区中有多少数据没有任何关系。
如果您在文本模式下打开流,则从中提取数据的正确方法是使用提取运算符(>>
)。然后,它很简单:
std::ifstream in_file("numbers.txt");
std::ofstream out_file("numbers.bin", std::ios::binary);
int i;
while (in_file >> i)
out_file.write(reinterpret_cast<char*>(&i), sizeof(int));
上面的代码将这样一个输入文本文件的工作:-4 21 1990 5425342 -3432 0 100
。
答
你必须分析你的文本文件,以获得int
在文件中的每个字符串,然后创建一个新的文件,并写入您的二进制数据与fputc()
或fwrite()
功能。
我们需要更多信息。你是如何设置的?它如何崩溃,在哪里? – 2012-07-24 14:09:44
也许,如果您显示失败的代码,我们可以提供帮助。 – Steve 2012-07-24 14:09:50
你用过'ios :: out |吗? ios :: binary'标志?向我们展示一些代码。 – RedX 2012-07-24 14:09:56