C ++ - Noob二进制文件IO问题

时间:2010-12-06 03:43:46

标签: c++ file-io binary

我目前正在尝试从输入文件中读取名称。该文件是.dat文件。

我可以使用以下方式读取数据:

    student_struct s;
    string fileName;

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


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

这一切都很好......但我不知道如何使用读入的数据。我意识到这是一个非常新手的问题。但我只想从输入文件中读取名称并将其存储在另一个字符串中。我该怎么做?

2 个答案:

答案 0 :(得分:2)

以这种方式读取文件只适用于没有指针的struct - 只是普通的变量类型。这意味着你甚至不能在那里存储一个表(例如char *)。如果您的学生结构更复杂,您应该有一些协议说明您的文件是如何组织的。例如,您可以使用一个或两个包含字符串大小的字节。

假设我们有以下内容:

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;
}

当然,此代码不包含任何错误处理,应始终对任何I / O操作执行错误处理。

答案 1 :(得分:0)

您是否可以使用结构,这意味着您在获取此代码之前已经在头文件中或某处定义了?

如果是这种情况,那么您将数据存储在“s”中,如果您将结构定义为:

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

然后要访问它,您使用s.firstname;s.lastname,因为您正在从一个文件中读取它,您可能想要使用while循环并读取直到文件结尾。