2011-03-07 4 views
3

이미 생성 된 거대한 파일이 있습니다. 필자는 파일의 다른 부분을 그대로 유지하면서 파일의 시작 부분에 몇 가지 데이터를 작성해야합니다. 다음 코드는 기존 파일을 손상시킵니다. 누구든지 올바른 방법으로 나를 도울 수 있습니까?C++ : fstream을 사용하여 바이너리 파일 패치하기

ofstream oFile(FileName,ios::out|ios::binary); 
oFile.seekp(0); 
oFile.write((char*)&i,sizeof(i));  
oFile.write((char*)&j,sizeof(i)); 
oFile.close(); 

편집 : 은 기본적으로 내가 시작 등 다양한 위치에 이미 존재하는 파일의 일부 바이트를 덮어 쓰려면. 나는 기록 할 위치의 바이트 주소를 안다. 내 글은 파일 크기를 변경하지 않습니다.

int mode = O_RDWR; 
int myFilDes = open (FileName, mode, S_IRUSR | S_IWUSR); 
lseek (myFilDes, 0, SEEK_SET); 
write (myFilDes, &i, sizeof (i)); 
write (myFilDes, &j, sizeof (j)); 
+2

파일의 맨 앞에 새 바이트를 추가하거나 덮어 쓰시겠습니까? – GWW

+0

16 진수 편집기에서 테스트 한 다음 작동하면 C++로 전달해야합니다. – Gareve

+0

덮어 쓸 필요가 있습니다. – Arpit

답변

1

당신이 누락 ios::in

사용 :

ofstream oFile(FileName,ios::out|ios::in|ios::binary);

3

당신이 수행해야합니다 :

oFile.seekp(0); 

쓰기를 수행하기 전에

나는 작동하는 다음 코드와 동일 뭔가를 할 필요가있다. ios :: ate는 파일에 추가하는 것을 의미합니다.

또한 ios :: out 대신 ios :: in을 사용해야합니다. ios :: out은 의도하지 않은 결과를 초래할 수있는 파일 잘라내기를 계획 함을 나타냅니다.

당신이 "삽입"싶다면 그것은 당신이 C 바이트의 스트림처럼 "파일"을 참조하십시오 ++ 것을 알아야했습니다 ... 그래서 당신이 그것을 가지고 있다면

+0

을 사용해주세요. 시도해 보았습니다. 그러나 원본 파일은 덮어 씁니다. 편집 된 질문을 확인할 수 있습니까? – Arpit

+0

@Arpit : 나중에 받아 들인 대답은이 대답과 똑같은 것을 자세히 말하지 않습니다. –

0

직관적이지의 :

| 1 | 5 | 10 | 11 | 2 | 3 |

그리고 당신은 첫 번째 위치에 삽입 된 데이터 (0 위치를 설정), 당신은 파일의 나머지 부분을 이동해야합니다 싶어 ...

관련 문제