2012-07-24 138 views
0

所以我做了一个程序,用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; 
}; 
+1

我们需要更多信息。你是如何设置的?它如何崩溃,在哪里? – 2012-07-24 14:09:44

+0

也许,如果您显示失败的代码,我们可以提供帮助。 – Steve 2012-07-24 14:09:50

+0

你用过'ios :: out |吗? ios :: binary'标志?向我们展示一些代码。 – RedX 2012-07-24 14:09:56

回答

2
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

+0

你到目前为止距离最近,但问题是我的文件在数字中没有任何空格。当我把一个文件放进去,就像你的文件一样分裂了,但是当我把文件放在一个大号码的时候,它会因为某种原因而不起作用。 – dvds414 2012-07-24 14:45:16

+0

然后我会告诉你输入文件,但它是很多字符放在这个网站上。这几乎只是一个非常大的文件。 – dvds414 2012-07-24 14:49:42

+0

如果您想将“大数”表示为一个整数,那么问题就不重要了。你需要一个可以处理大量整数的库。 – jrok 2012-07-24 15:00:50

0

你必须分析你的文本文件,以获得int在文件中的每个字符串,然后创建一个新的文件,并写入您的二进制数据与fputc()fwrite()功能。

相关问题