запись в двоичные файлы - PullRequest
       22

запись в двоичные файлы

8 голосов
/ 30 ноября 2011
#include <iostream>
#include <fstream>

using namespace std;

class info {

private:
    char name[15];
    char surname[15];
    int age;
public:
    void input(){
        cout<<"Your name:"<<endl;
            cin.getline(name,15);
        cout<<"Your surname:"<<endl;
        cin.getline(surname,15);
        cout<<"Your age:"<<endl;
        cin>>age;
        to_file(name,surname,age);
    }

    void to_file(char name[15], char surname[15], int age){
        fstream File ("example.bin", ios::out  | ios::binary | ios::app);
    // I doesn't know how to fill all variables(name,surname,age) in 1 variable (memblock) 
        //example File.write ( memory_block, size ); 

File.close();
    }

};

int main(){

info ob;
ob.input();

 return 0;
}

Я не знаю, как записать более 1 переменной в файл, помогите, я включил пример;) Может быть, есть лучшие способы записи в файл, пожалуйста, помогите мне с этим, мне тяжело решить.

Ответы [ 2 ]

16 голосов
/ 18 декабря 2011

Для файла text вы можете легко вывести одну переменную на строку, используя << к той, которую вы используете с std::cout.

Для двоичного файла необходимо использовать std::ostream::write(), который записывает последовательность байтов.Для вашего age атрибута вам нужно будет reinterpret_cast это const char* и записать столько байтов, сколько необходимо для хранения int для вашей архитектуры машины.Обратите внимание, что если вы намереваетесь прочитать эту двоичную дату на другом компьютере, вам придется учитывать размер слова и порядковый номер .Я также рекомендую обнулить буферы name и surname перед их использованием, чтобы в результате не возникли артефакты неинициализированной памяти в вашем двоичном файле.

Также нет необходимости передавать атрибуты классав метод to_file().

#include <cstring>
#include <fstream>
#include <iostream>

class info
{
private:
    char name[15];
    char surname[15];
    int age;

public:
    info()
        :name()
        ,surname()
        ,age(0)
    {
        memset(name, 0, sizeof name);
        memset(surname, 0, sizeof surname);
    }

    void input()
    {
        std::cout << "Your name:" << std::endl;
        std::cin.getline(name, 15);

        std::cout << "Your surname:" << std::endl;
        std::cin.getline(surname, 15);

        std::cout << "Your age:" << std::endl;
        std::cin >> age;

        to_file();
    }

    void to_file()
    {
        std::ofstream fs("example.bin", std::ios::out | std::ios::binary | std::ios::app);
        fs.write(name, sizeof name);
        fs.write(surname, sizeof surname);
        fs.write(reinterpret_cast<const char*>(&age), sizeof age);
        fs.close();
    }
};

int main()
{
    info ob;
    ob.input();
}

Пример файла данных может выглядеть следующим образом:

% xxd example.bin
0000000: 7573 6572 0000 0000 0000 0000 0000 0031  user...........1
0000010: 3036 3938 3734 0000 0000 0000 0000 2f00  069874......../.
0000020: 0000                                     ..
5 голосов
/ 30 ноября 2011
File.write(name, 15);
File.write(surname, 15);
File.write((char *) &age, sizeof(age));
...