0

我的示例文本文件如下所示:

Name: First
Email: first@gmail.com

Name: Second
Email: second@gmail.com

目前我编写了一个函数来从指定的二进制文件中读取记录:

Staff getARecord (fstream& afile, const char fileName [], int k)
{
    afile.open (fileName, ios::in | ios::binary);

    Staff s;

    afile.seekg ((k - 1) * sizeof (Staff), ios::beg);
    afile.read (reinterpret_cast <char *>(&s), sizeof (s));

    afile.close ();
    return s;
}

Staff是一个由nameemail字段组成的结构。然后我将根据用户输入获取记录:

int k;

cout << "Enter your email: ";
cin >> k;

Staff s = getARecord(afile,"staff.dat",k);

然后,如果用户的输入是数字(现在为 1 和 2,因为我只有 2 条记录),那么我已经成功读取了数据,seekg如果用户输入的是电子邮件而不是记录号,我该如何检索相同的结果?

4

1 回答 1

0

正如评论中提到的,您将数据加载到结构中的方式存在严重问题Staff:这些行afile.seekg(...); afile.read(...);很奇怪:seekg不应该像您期望的那样工作。由于您的文件是文本文件,因此您应该使用文本技术:运算符>>getline方法。

如果你真的想Staff直接从文件中加载一个项目,你可以重载operator>>:(这只是一个例子,应该改进)

struct Staff{
    string name, email;
};

istream& operator>>(istream& is, Staff& staff)
{
    string s;
    while(is >> s && s != "Name:"); // Look for "Name:"

    staff.name = "";
    while(is >> s && s != "Email:"){ // Look for "Email:"
        staff.name += s + " "; // Load name (if multiple words)
    }
    staff.email = s; // Load email

    // Handle errors
    if(/* we couldn't load staff */)
        is.setstate(std::ios::failbit);

    return is;
}

然后,如果你想进行搜索,你别无选择,只能从头开始读取文件:

Staff staff;

// Search by id
for(int i=0 ; i<=k ; i++)
    afile >> staff;
return staff;

// Search by email
while(afile >> staff){
    if(staff.email == email)
        return staff;
}
return /*Error*/;
于 2015-07-17T13:13:58.040 回答