2014-02-08 3 views
-1

저는 C++을 처음 접했으므로 아마도 매우 분명 할 것입니다.C++, 왜 배열이 비어 있습니까?

내 프로그램에서는 배열을 만들고 이진 파일에 쓰고 다른 배열로 읽어서 인쇄합니다.

바이너리 파일을 새 배열로 읽을 수없는 것 같습니다. 새 배열을 인쇄하려고하면 빈 배열임을 알 수 있습니다. 내가 잘못한 것을 볼 수있게 도와 줄 수 있니?

int main(){ 
    int N; 
    std::cin >> N; 
    int* array = new int[N*N]; 

    for(int row = 0; row < N; row++){ 
     for(int column = 0; column < N; column++){ 
      array[row*N + column] = (row + column)%10; 
      cout << array[row*N + column]; 
     } 
     cout << "\n"; 
    } 

    //---------------------------------------------------- 

    ofstream out("array.txt", ios::out | ios::binary); 
    out.write((char*)array,N*N*sizeof(int)); 

    //------------------------------------------------------ 

    int* altArray = new int[N*N]; 
    ifstream in; 
    in.open("array.txt", ios::in | ios::binary); 

    in.read((char*)altArray, N*N*sizeof(int)); 

    //----------------------------------------------------- 

    cout << "From Binary File\n"; 

    for(int row = 0; row < N; row++){ 
     for(int column = 0; column < N; column++){ 
      cout << altArray[row*N + column]; 
     } 
     cout << "\n"; 
    } 

    //---------------------------------------------------- 

    delete []array; 
    delete []altArray; 
    return 0; 
} 
+2

파일을 읽기 전에 outstream을 플러시/닫기를 시도하십시오. 버퍼링이 문제가 될 수 있습니다. –

+0

** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** 당신은 그것을 어떻게 알 수 있습니까? 네가 묻는 것을 얻지 못 하겠니? ?? –

+0

@JoachimIsaksson 그게 고쳐, 고마워! – user2726232

답변

1

N의 크기에 따라 배열 내용이 OUPUT 버퍼에 플러시되지 여전히 수 있습니다. 버퍼를 디스크에 플러시하거나 파일을 닫아야합니다 (예 :

out.close(); 

그런 다음 다시 읽을 때 배열의 내용을 볼 수 있습니다.

1
out.write((char*)array, N*N*sizeof(int)); 
// ... 
in.read((char*)altArray, N*N*sizeof(int)); 

파일 스트림은 버퍼링을 통해 데이터를 유지합니다. 데이터가 프로그램에 읽히기 전에 출력 시퀀스가 ​​버퍼에서 플러시되지 않은 것 같습니다.

out << std::flush; 

이 또한 파일 스트림이 더 이상 필요하지 않은 경우 파일을 닫는 없다하여 수행 할 수 있습니다 ..

또 다른 옵션은 당신이 그렇게 함께 스트림을 tie() 수 있다는 것입니다 : 먼저 출력 스트림을 플러시 할 필요가 읽기가 수행 될 때마다 입력 시퀀스가 ​​동기화됩니다.

in.tie(&out); 
관련 문제