2010-12-06 2 views
0

В настоящее время я пытаюсь читать имена из входного файла. Файл является .dat-файлом.C++ - Noob Binary File IO question

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

student_struct s; 
    string fileName; 

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


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

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

+2

Ну, вы ** можете ** просто читать в такой структуре, но это, вероятно, не очень хорошая идея (например, такие вещи, как указатели, не будут использоваться после сохранения/загрузки, как это; версия компилятора или элементы структуры могут сломать старые сохраненные данные). – 2010-12-06 04:02:14

ответ

2

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

Допустим, мы имеем следующее:

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

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

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

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

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

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

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