Обработка файлов в C ++. Как это работает? - PullRequest
0 голосов
/ 03 декабря 2011

Я наткнулся на этот код для создания файлов .dat на c ++.

Эти две строки я не мог понять .. Как они работают?

outfile.write(reinterpret_cast<char*>(&pers), sizeof(pers));

ofstream outfile("PERSON.DAT",ios::app| ios::binary);
#include <fstream> //for file streams
#include <iostream>

using namespace std;

class person //class of persons    
{
protected:
    char name[80]; //person’s name
    short age; //person’s age
public:
    void getData() //get person’s data
    {
        cout <<"Enter name: "; cin >> name;
        cout <<"Enter age: "; cin >> age;
    }
};

int main()
{
    char ch;
    person pers; //create a person
    ofstream outfile("PERSON.DAT",ios::app| ios::binary);
    do {
        pers.getData(); //get data for person
        outfile.write(reinterpret_cast<char*>(&pers), sizeof(pers));
        cout <<"Enter another person (y/n)? ";
        cin >> ch;
    } while (ch == 'y');

    //create ofstream object
    //write to it
    return 0;    
}

Ответы [ 2 ]

3 голосов
/ 03 декабря 2011
ofstream outfile("PERSON.DAT",ios::app| ios::binary);

Начиная со второй строки, создается поток выходных файлов, который затем открывает файл с именем «PERSON.DAT», используя комбинацию из двух режимов; добавить и двоичный. Это означает, что любые данные, отправленные в выходной поток, будут добавлены к существующим данным в файле, вы фактически добавляете данные в файл, а не перезаписываете его. Бинарный режим указывает, что любые данные, записанные в файл, будут интерпретироваться как есть. В Windows есть режим, называемый текстовым режимом, в котором определенные символы, такие как '\ n', переводятся в их эквиваленты Windows. Бинарный режим является стандартным режимом, он просто означает, что все, что вы посылаете в выходной поток, записывается без изменений.

outfile.write(reinterpret_cast<char*>(&pers), sizeof(pers));

Эта команда записывает объект pers в выходной файл. метод write () ожидает два параметра; первый - указатель на серию байтов, которые должны быть записаны в файл, а второй - целое число, указывающее количество байтов из серии, подлежащей записи. Функция reinterpret_cast () преобразует указатель на объект person от person * до char *, который является типом параметра, необходимым для метода записи. sizeof () - это просто функция, которая получает размер объекта в байтах, который, как уже упоминалось, требуется write () .

0 голосов
/ 03 декабря 2011

Они просто пишут побайтную структуру в памяти, начиная с того места, где объект начинается в памяти, и переходят к размеру объекта, как если бы это была просто группа char с.

Это не самый блестящийидея, и автор может в какой-то момент столкнуться с непредвиденными осложнениями.

...