2012-07-24 1 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

추가 정보가 필요합니다. 어떻게 세웠 니? 어떻게 충돌하고 어디에서? –

+0

아마, 실패한 코드를 보여 주면 도움이 될 것입니다. – Steve

+0

당신은'ios :: out | ios :: binary 플래그? 몇 가지 코드를 보여주십시오. – RedX

답변

2
OutputFile.write((char*)InputFile.get(), sizeof(InputFile)); 

첫째, istream::get() 추출하여 하나 개의 스트림에서 문자와 정수로 주조 값을 반환합니다. 결과는 일시적이며 char에 대한 포인터로 캐스팅됩니다! 왜냐하면 C 스타일의 캐스트는 기본적으로 컴파일러에게 "내가하는 일을 안다!"라고 말하기 때문에 컴파일되지만, 런타임에 이상한 것들을 확실히 할 것입니다. 당신은 쓰기를 원하는 값이 저장되어있는 객체의 주소를 얻어서 그 주소를 캐스팅해야합니다.

두 번째 것은 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

+0

그리고 나는 당신에게 입력 파일을 보여줄 것이지만,이 사이트에 올리는 것은 많은 문자들입니다. 정말 큰 숫자의 파일 일뿐입니다. – dvds414

+0

"큰 숫자"를 하나의 정수로 나타내려면 문제는 간단하지 않습니다. 당신은 알뜰하게 큰 정수를 처리 할 수있는 라이브러리가 필요합니다. – jrok

0

은 파일의 모든 문자열을 int을 얻을 그냥 fputc() 또는 fwrite() 기능을 사용하여 이진 데이터를 새 파일을 작성하고 작성하는 텍스트 파일을 구문 분석합니다.