2013-06-28 6 views
1

해결했습니다! 모두들 대단히 감사합니다. 내 날이되었습니다! (안녕하세요, 오전 4시)C++ 이진 파일을 다른 파일로 편집

이진 파일로 .dat 파일을 열고 다른 .dat 파일의 첫 번째 1840 16 진수 문자로 바꾼 프로그램을 C++로 작성하려고합니다. 첫 번째 .dat 파일의 나머지 16 진수 값은 동일하게 유지합니다. 나는 오늘 약 12 ​​시간을 보냈으며 거의 ​​성공하지 못했다. 저는 초급 프로그래머입니다. 한 학기 동안 C++ 과정을 수강 했으므로 스트림에 참여하지 못했습니다.

은 (는 파일 및 모든 열리지 만 새 값을 추가 한 후 모든 것을 삭제)

어떤 도움을 크게 감상 할 수
#include <iostream> 
#include <iomanip> 
#include <fstream> 
#include <string> 
#include <cmath> 
#include <cstring> 
using namespace std; 



int main(){ 

string filename; 
long size; 
char* memblock; 

    cout << " Enter a file to be modded by Mod.dat "; 
    cin >> filename; 

    ofstream infile (filename ,std::ofstream::binary); 
    //filename: the file that will be opened and changed) 

    ifstream modFile ("Mod.dat", ifstream::binary); 
    // (mod.dat is the file that i get the first 1840 hex values from) 




modFile.seekg (0,modFile.end); 
size = modFile.tellg(); 
memblock = new char [size]; 
modFile.seekg (0, ios::beg); 
    modFile.read (memblock, size); 

infile.write(memblock, 1840); 

modFile.close(); 
infile.close(); 


cout << endl; 
return 0; 
} 

, 나는이 작업을 수행하는 몇 가지 간단한 방법이 희망을.

해결! 모두들 대단히 감사합니다. 내 일이 이루어지고있다 (물론 아침의 오전 4시)

+0

당신의 어딘가에서 당신의 memblock을 삭제 하시길 바랍니다. – doctorlove

답변

1

내 선호 수정, 그냥 입력 파일의 개방에 ofstreeam::in을 추가하는 것입니다 내 버전에서는 std :: string을 입력으로 사용하지 않습니다).

로컬 시스템에서이를 테스트했습니다. mod.dat가 실제로 "Mod.dat"라는 것을 알게되었습니다.

if (!infile) 
{ 
cout << "Couldn't open " << filename << endl; 
} 

과 modfile 라인과 유사한)

ofstream infile 행 다음에 이런 좋은 또한 파일이 실제로 열려 있는지 확인하기 위해 아이디어, 그래서 뭔가 아마.

그리고 modfile 크기의 첫 번째 부분이 무엇인지 알아 내려고 노력 했으므로 파일 작성을 위해 사용하는 것이 좋습니다.

+0

해결되었습니다! 모두들 대단히 감사합니다. 내 하루가되었습니다! – user2530952

3

편집 : 당신은 같은과 장소에 파일 을 modidy 수

:

std::fstream s(my_file_path, std::ios_base::binary); 
s.seekp(position_of_data_to_overwrite, std::ios_base::beg); 
s.write(my_data, size_of_data_to_overwrite); 

std::fstream는 자르지됩니다 입력 파일은 std::ofstream입니다.


다른 해결책은 읽기 및 쓰기에 동일한 파일을 사용하지 않는 것입니다. 세 파일 사용 :

  • 출력 파일을위한 파일.
  • 첫 번째 입력 파일에 하나.
  • 두 번째 입력 파일에 하나.

fstream infile (filename ,std::ofstream::binary); 원본 파일의 내용을 유지하지 않습니다. 당신이 쓰는 모든 것은 파일의 내용을 지울 것입니다.

따라서, 당신이해야합니다

  • 는 "모"파일을 열 출력 파일을 열고, 첫 번째 파일에서 첫 번째 1840 바이트를 읽어 출력 파일로 물품.
  • "주 입력 파일"파일을 열고 커서를 1840으로 이동하고 나머지 데이터를 읽고 출력 파일에 씁니다.

"주 입력 파일"크기에 따라 읽기/쓰기 작업을 버퍼링 할 수 있습니다.

ofstream infile (filename.c_str(), std::ofstream::binary | ofstream::in); 

(내 빌드에서 c_str()를 사용했다 glibc는 같은 : 마티유 Rouget의 수정이 실제로 작업을 수행하지만

+0

그래, 그 진짜 속도를 시도 할 것입니다 ... – user2530952

+2

사실, fstream ("example.bin", ios :: in | ios :: out | ios :: app | ios :: binary) 읽기 및 쓰기에 동일한 fstream을 사용합니다. –

+0

해결되었습니다! 모두들 대단히 감사합니다. 내 하루가되었습니다! – user2530952

관련 문제