2012-06-22 3 views
1

int 배열을 fstream에 쓰려고하는데 fstream.write을 호출하면 예외가 발생합니다.C++ 쓰기 int 버퍼

fstream을 사용하여 파일에 int 배열을 쓸 수 있습니까?

int main(int argc, char * argv[]) 
{ 
    fstream amostra("D:\\Amostra.txt", ios::out | ios::binary); 
    const int total_elements_block = 1024; 
    const int buffer_size = total_elements_block; 

    const int total_buffer = 10; 

    int * buffer = new int [buffer_size]; 
    //for (int j=0; j<total_buffer; j++){ 
     for (int i =0; i<total_elements_block; i++){ 
      buffer[i] = i; 
     } 
     amostra.write((char *)(&buffer), total_elements_block*4); 
    //} 

    amostra.close(); 
    delete []buffer; 

    return 0; 
} 
+1

"fstream을 사용하여 파일에 int 버퍼를 쓸 수 있습니까?" fstream은 파일 형식을 올바르게 지정하면 파일을 쓸 수 있습니다. 간단한 대답 : 예. 당신이 실제 코드를 원한다면 그저 단순한 부울 답변이 아니라 요청하십시오. – TheZ

+1

귀하가 예외를 게시하십시오. –

+0

안전/휴대 성을 위해 total_elements_block * sizeof (buffer [0])를 사용해야합니다. –

답변

5

Captain Obvlious가 문제를 진단하는 데있어 옳았지만 실제로는 여기에 몇 가지 가능한 수정 사항이 있습니다.

그가 제안하고 사용하는대로 (char *)(buffer)을 사용할 수 있지만이 스타일에는 의견이 분분합니다.

먼저 C 스타일의 캐스트를 사용합니다. 이는 C++ 코드에서 피해야합니다. 그러면 약간 개선 된 버전이 reinterpret_cast<char *>(buffer)이됩니다. 이렇게하면 const을 제거하는 것과 같은 바보 같은 짓을하지 않게됩니다.

그러나 나는 그보다 약간 더 잘할 수 있다고 생각합니다. 어느 시점에서 일반 배열을 사용할 수 없다고 결정할 수 있습니다. 어쩌면 C++ 11 std::array 또는 std::vector으로 변경하려고 할 수 있습니다. 갑자기 코드가 작동하지 않습니다. 일반 C 스타일 배열은 가장 자주 변경되는 데이터 유형입니다. 이러한 이유로 reinterpret_cast<char *>(& buffer[0])과 비슷한 모양을 고려할 수 있습니다.

코드가 이식 가능하지 않음을 유의하십시오. int이 메모리에 배치되는 방법은 구현에 따라 정의됩니다. Detecting endianness programmatically in a C++ program

5

주소를 버퍼에 올바르게 전달하지 않습니다.

(char *)(&buffer) 

buffer에 포함 된 포인터를 사용하는 대신 buffer의 주소를 취하도록 컴파일러에 지시 새로 할당 된 메모리에 포인트한다. 버퍼 자체의 주소를 얻으려면 다음과 같이 변경하십시오.

(char *)(buffer)