2010-02-18 3 views
5

아마도 fstream 객체를 사용해야 할 것 같지만 어떻게할지는 모르겠다. 기본적으로 파일에서 바이트 버퍼로 읽고 수정 한 다음이 바이트를 파일에 다시 쓰려고합니다. 바이트 I/O를 수행하는 방법을 알아야합니다.파일에서 바이트 읽기 및 쓰기 (C++)

+2

이진 모드로 열려고합니다. – GManNickG

+1

@ GManNickG 충분히 스트레스를받을 수는 없습니다. 그렇게하지 않으면 무작위로 1 시간 정도 머리를 벽에 부딪치게됩니다. 예를 들어 ... 임의의'cout << file_stream.tellg();를 임의의 위치에 삽입하면 코드가 작동하고 그렇지 않으면 실패합니다. – Tibor

답변

7
#include <fstream> 

ifstream fileBuffer("input file path", ios::in|ios::binary); 
ofstream outputBuffer("output file path", ios::out|ios::binary); 
char input[1024]; 
char output[1024]; 

if (fileBuffer.is_open()) 
{ 
    fileBuffer.seekg(0, ios::beg); 
    fileBuffer.getline(input, 1024); 
} 

// Modify output here. 

outputBuffer.write(output, sizeof(output)); 

outputBuffer.close(); 
fileBuffer.close(); 

나는 이것이 어떻게되는지 생각합니다.

+0

나는 하나의 함수를 모두 넣지 않기 때문에 일반적으로 동적으로 만들 것입니다. – Craig

+4

new를 사용한 후에도 m_content를 삭제해야합니다. C++에는 가비지 수집이 없습니다. 또한 1024 바이트는 스택에 아주 쉽게 맞아야하므로'char m_content [1024];를 사용하십시오. –

+0

^예 잊지 마세요. D. – Craig

0

파일 I/O를 수행하는 동안 파일 및 오류 조건의 끝을 확인하는 루프에서 파일을 읽어야합니다. 당신이 작은 파일 크기를 처리하는 경우 당신이

while (fileBufferHere.good()) { 
    filebufferHere.getline(m_content, 1024) 
    /* Do your work */ 
} 
1

처럼 위의 코드를 사용할 수 있습니다, 나는 전체 파일을 읽는 것이 쉽다는 것을 권장합니다. 그런 다음 버퍼로 작업하고 전체 블록을 다시 작성하십시오. 위의 응답에서 열린 입/출력 파일을 채우는 것으로 가정하면 블록을 읽는 방법을 보여줍니다.

// open the file stream 
    ..... 
    // use seek to find the length, the you can create a buffer of that size 
    input.seekg (0, ios::end); 
    int length = input.tellg(); 
    input.seekg (0, ios::beg); 
    buffer = new char [length]; 
    input.read (buffer,length); 

    // do something with the buffer here 
    ............ 
    // write it back out, assuming you now have allocated a new buffer 
    output.write(newBuffer, sizeof(newBuffer)); 
    delete buffer; 
    delete newBuffer; 
    // close the file 
    .......... 
+0

아니면 그냥 버퍼를 변경하고 다시 쓸 수 있어야합니다. –

+0

모두 수정 유형에 따라 다릅니다. 스트림에서 하나 이상의 바이트를 일대일로 대체하는 것이 더 쉬울 것입니다. 그러나 변경에 더 많은 바이트를 추가하면 메모리 오버플로 예외가 발생할 수 있습니다. 이는 일반적인 함정입니다. –