用分隔符读取文件

use*_*575 5 c++ file-io struct

如何读取文件中的行并将该行的特定段分配给结构中的信息?以及如何停在空白行,然后再次继续直到到达文件末尾?

背景:我正在构建一个程序,该程序将接收输入文件,读入信息,并使用双重哈希将该信息放入哈希表的正确索引中。

假设我有这个结构:

struct Data
{
    string city;
    string state;
    string zipCode;
};
Run Code Online (Sandbox Code Playgroud)

但是文件中的行采用以下格式:

20

85086,Phoenix,Arizona
56065,Minneapolis,Minnesota

85281
56065
Run Code Online (Sandbox Code Playgroud)

抱歉,但我似乎仍然无法弄清楚。我很难读文件。第一行基本上是要构造的哈希表的大小。下一个空白行应忽略。接下来的两行是应该进入结构并被散列到哈希表中的信息。然后,应忽略另一个空白行。最后,输入最后两行,需要进行匹配以查看它们是否存在于哈希表中。因此,在这种情况下,找不到85281。找到56065。

0x4*_*2D2 5

正如其他两个答案指出的那样,您必须使用std::getline,但这就是我要这样做的方式:

if (std::getline(is, zipcode, ',') &&
    std::getline(is, city,   ',') &&
    std::getline(is, state))
{
    d.zipCode = std::stoi(zipcode);
}
Run Code Online (Sandbox Code Playgroud)

我所做的唯一真正的更改是,将提取内容包含在一条if语句中,以便您可以检查这些读取是否成功。此外,为了轻松完成此操作(您不想为每个Data对象都输入上面的内容),可以将其放在函数中。

您可以像这样重载该类的>>运算符Data

std::istream& operator>>(std::istream& is, Data& d)
{
    std::string zipcode;
    if (std::getline(is,  zipcode, ',') &&
        std::getline(is, d.city,   ',') &&
        std::getline(is, d.state))
    {
        d.zipCode = std::stoi(zipcode);
    }

    return is;
}
Run Code Online (Sandbox Code Playgroud)

现在,它变得非常简单:

Data d;

if (std::cin >> d)
{
    std::cout << "Yes! It worked!";
}
Run Code Online (Sandbox Code Playgroud)