我目前正在尝试从输入文件中读取名称。该文件是.dat文件。
我可以使用以下方式读取数据:
student_struct s;
string fileName;
fstream inFile;
inFile.open(fileName, ios::in | ios::binary);
inFile.read(reinterpret_cast<char*>(&s),sizeof(Student));
这一切都很好......但我不知道如何使用读入的数据。我意识到这是一个非常新手的问题。但我只想从输入文件中读取名称并将其存储在另一个字符串中。我该怎么做?
答案 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循环并读取直到文件结尾。