C ++ Двоичные файлы для чтения и записи - PullRequest
0 голосов
/ 29 апреля 2019

хорошо, так что я на втором семестре в моем университете сделал c и c ++ сейчас делает проект в DevC.

В настоящее время я делаю программу, которая будет выполнять процесс зарядки магазина, имея и редактируя базу данных.

Пробовал писать и читать полную структуру, но не работал, поэтому я записал 2 int числа и прочитал их, но это также не помогло при получении случайного числа при чтении, даже если я пишу txt, числа кажутся нормальными.

//write and read are different fucntion only 1 is called .
//file creation code
int AccountNumber=0;
ofstream FileCreator("Database.dat",ios::binary);   
FileCreator<<AccountNumber;
AccountNumber=1;
FileCreator<<AccountNumber;

и

//reading code

int AccountNumber=0;
ifstream FileCreator("Database.dat",ios::binary);
FileCreator.seekg(0,ios::beg);

FileCreator.read(reinterpret_cast<char*>(&AccountNumber), sizeof(AccountNumber));
cout<<AccountNumber<<endl;
FileCreator.read(reinterpret_cast<char*>(&AccountNumber), sizeof(AccountNumber));
cout<<AccountNumber<<endl;

Я ожидаю 0 и 1 на выходе, но получаю 12592 и 12592.

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Чтобы завершить ответ @Thomas Matthews

, но почему это важно?<< пишет иначе, что .write в двоичных файлах? </p>

Вне окна вы не увидите разницы, под окнами \ n сохраняются / читаются без изменений, если файл открывается в двоичном режиме, иначезапись \n производит \r\n, а чтение \c\n возвращает \n.Это как разница между "r" / "rb" и "w" / "wb" для fopen .

Вы можете смешивать использование оператора <</>> и чтение / записьв двоичном режиме или нет, но вы должны позаботиться о разделителях, например:

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
  int AccountNumber = 123;

  {
    ofstream bin("bin",ios::binary);   

    bin << AccountNumber << '\n'; // a \n to finish the number allowing to read it later
    bin.write((char *) &AccountNumber, sizeof(AccountNumber));
  }
  {
    ofstream txt("txt");   

    txt << AccountNumber << '\n';
    txt.write((char *) &AccountNumber, sizeof(AccountNumber));
  }
  {
    ifstream bin("bin",ios::binary);

    AccountNumber = 0;
    bin >> AccountNumber;
    cout << AccountNumber << endl;

    // I have to read the \n with read() because >> bypass it.
    // Supposing I written '@' rather than '\n' `bin >> c;` can be used
    char c;

    bin.read(&c, 1);
    cout << (int) c << endl;

    AccountNumber = 0;
    bin.read((char *) &AccountNumber, sizeof(AccountNumber));
    cout << AccountNumber << endl;
  }

  return 0;
}

Компиляция и выполнение (вне Windows):

pi@raspberrypi:/tmp $ g++ -pedantic -Wextra -Wall f.cc
pi@raspberrypi:/tmp $ ./a.out
123
10
123
pi@raspberrypi:/tmp $ cmp txt bin
pi@raspberrypi:/tmp $ 

Я не под Windowsпоэтому использовать двоичный режим или нет ничего не меняет, два файла идентичны

0 голосов
/ 29 апреля 2019

Для записи двоичных файлов используйте метод std::ostream::write(), а не operator<<:

FileCreator.write((char *) &AccountNumber, sizeof(AccountNumber));

Приведение необходимо, потому что нет перегрузки для записи целых чисел в поток.

Помните, что read и write спарены для двоичного ввода / вывода.

Редактировать 1: записи фиксированной длины и переменной длины
Помните, что вам нужно размер предмета при письме и чтении. Это будет работать для элементов и структур данных фиксированного размера / длины. Однако он не очень хорошо работает с данными переменной длины, такими как текст.

Для записей переменной длины вы можете сначала записать длину, а затем данные:

static const char hello[] = "Hello";
static const unsigned int data_size(sizeof(hello) - 1);
FileCreator.write((char *) &data_size, sizeof(data_size));
FileCreator.write(&hello[0], data_size);

В приведенном выше примере "- 1" присутствует, так что завершающий символ NUL не записывается в файл. Вам не нужно это для двоичных файлов, но YMMV (я использую идиому при записи в консоль и другие читаемые человеком потоки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...