Не можете прочитать простые двоичные числа из файла? (C ++) - PullRequest
8 голосов
/ 07 июня 2011

Мой код выглядит так:

ОБНОВЛЕНО :

#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char **argv)
{
  ifstream r("foo.bin", ios::binary);
  ofstream w("foo.bin", ios::binary);
  int i;

  int ints[10] = {0,1,2,3,4,5,6,8,9};
  w.write((char*)&ints, sizeof(ints));

  int in_ints[10];
  r.read((char*)&in_ints, sizeof(in_ints));

  for(i = 0;i < 10;i++) {
    cout << in_ints[i] << " ";
  }
  cout << endl;

  return 0;
}

Теперь часть записи выглядит успешной, например, запустив команду od с32-битные значения (моя система 32-битная) будет отображать правильную последовательность, включая шестнадцатеричный дамп.

Считая, однако, я получаю случайные последовательности, такие как отрицательные целые числа, которых не должно быть (это разделено, и в основномнули, поскольку мои целые числа малы, биты знака не должны быть включены.)

Видите ли вы, почему мой метод чтения не работает, когда он действительно противоположен моему методу записи?

Ответы [ 3 ]

7 голосов
/ 07 июня 2011

попробуйте w.flush() или w.close() до r.read. проблема в том, что когда вы пишете, он обычно буферизует текст, а не сохраняет его в файле. так что в файле ничего нет r.read.

6 голосов
/ 07 июня 2011

Этот код:

#include <iostream>
#include <fstream>
using namespace std;

int main() {
    {
        ofstream w( "foo.txt" );
        int ints[10] = {0,1,2,3,4,5,6,8,9};
        w.write((char*)&ints, sizeof(ints));
    }
    {
        ifstream r( "foo.txt" );
        int in_ints[10];
        r.read((char*)&in_ints, sizeof(in_ints));
        for( int i = 0; i < 10; i++) {
            cout << in_ints[i] << " ";
        }
    }
}

печать:

0 1 2 3 4 5 6 8 9 0

Обратите внимание, что в вашей инициализации отсутствуют некоторые числа.

1 голос
/ 07 июня 2011

Данные, записанные в файл, не обязательно видны другим потокам (в тот же процесс или нет), пока файл не будет закрыт или хотя бы сброшен. И если файл "foo.bin" не существует до запуска программы, открыть его для чтения не удастся (и поэтому все дальнейшее использование будет не оп). Ваша программа нарушает одно из самых основных правил программирование: если что-то может потерпеть неудачу, всегда проверяйте, что не было раньше продолжается. Вы не проверяете результаты своего ввода-вывода.

Я мог бы также добавить, что чтение и запись данных таким образом очень, очень хрупкий, и может гарантированно работать только в том же процесс - даже перекомпиляция с другой версией компилятора или другие параметры компилятора могут привести к изменить с результатами, которые вы не сможете прочитать записанные данные ранее. В случае массивов int это, конечно, очень вряд ли, если вы не измените архитектуру машины. Но в В общем, если вам нужно будет перечитать данные в будущем, это Технику лучше избегать. ((char*) reinterpret_cast, и как мы знаем, reinterpret_cast очень сильный сигнал, что есть проблема переносимости.)

...