C ++ - вопрос ввода-вывода в двоичном файле Noob - PullRequest
0 голосов
/ 06 декабря 2010

Я сейчас пытаюсь прочитать имена из входного файла.Это файл .dat.

Я могу прочитать данные, используя:

    student_struct s;
    string fileName;

    fstream inFile;
    inFile.open(fileName, ios::in | ios::binary);


    inFile.read(reinterpret_cast<char*>(&s),sizeof(Student));

Все это прекрасно работает ... Но я не знаю, как использовать прочитанные данныеЯ понимаю, что это очень начинающий вопрос.Но я просто хочу прочитать имя из входного файла и сохранить его в другой строке.Как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 06 декабря 2010

Чтение вашего файла таким образом будет работать только для структуры, не имеющей указателей вообще - только простые типы переменных.Это означает, что вы не можете хранить там даже таблицу (например, char *).Если ваша структура Student более сложная, у вас должен быть какой-то протокол, в котором указано, как организован ваш файл.Например, вы можете использовать один или два байта, которые будут содержать размер строки.

Допустим, у нас есть следующее:

struct Student
{
    std::string name;
    int some_id;
    std::string hair_color_description;
};

Теперь, когда мы хотим записать это в файл, мы можемdo

void saveToFile( Student s, fstream& f )
{
    size_t strSize = s.name.size();
    f.write( reinterpret_cast<char*>( &strSize ), sizeof(size_t) );
    f.write( reinterpret_cast<char*>( s.name.data() ), strSize );
    f.write( reinterpret_cast<char*>( &s.some_id ), sizeof(int) );
    strSize = s.hair_color_description.size();
    f.write( reinterpret_cast<char*>( &strSize ), sizeof(size_t) );
    f.write( reinterpret_cast<char*>( s.hair_color_description.data() ), strSize );
}

И для загрузки

void loadFromFile( Student& s, fstream& f )
{
    char *buffer = NULL;
    size_t strSize;
    f.read( reinterpret_cast<char*>( &strSize ), sizeof(size_t) );
    buffer = new char[strSize];
    f.read( buffer, strSize );
    s.name = buffer;
    delete[] buffer;
    f.read( reinterpret_cast<char*>( &s.some_id ), sizeof(int) );
    f.read( reinterpret_cast<char*>( &strSize ), sizeof(size_t) );
    buffer = new char[strSize];
    f.read( buffer, strSize );
    s.hair_color_description = buffer;
    delete[] buffer;
}

Конечно, этот код не содержит никакой обработки ошибок, которая всегда должна выполняться для любых действий ввода / вывода.

0 голосов
/ 06 декабря 2010

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

Если это так, то вы сохраняете данные в «s», и если вы определили структуру как:

student_struct
{
    char firstname[FIRST_NAME_LEN];
    char lastname[LAST_NAME_LEN];
};

Затем для доступа к нему вы используете s.firstname; и s.lastname, так как вы читаете его из файла, вы можете использовать цикл while и читать до конца файла.

...