2014-02-08 4 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

Попробуйте промыть/закрыть выход, прежде чем пытаться прочитать файл. Я подозреваю, что буферизация может быть вашей проблемой. –

+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);