c++ - 读取带分隔符的文件

标签 c++ file-io struct

如何从文件中读入行并将该行的特定段分配给结构中的信息?我怎样才能停在一个空白行,然后再次继续直到到达文件末尾?

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

假设我有结构:

struct Data
{
    string city;
    string state;
    string zipCode;
};

但文件中的行格式如下:

20

85086,Phoenix,Arizona
56065,Minneapolis,Minnesota

85281
56065

抱歉,我似乎还是想不通。我真的很难阅读文件。第一行基本上是要构造的哈希表的大小。应忽略下一个空行。然后接下来的两行是应该进入结构并散列到哈希表中的信息。然后应该忽略另一个空行。最后,最后两行是输入,需要匹配以查看它们是否存在于哈希表中。所以在这种情况下,找不到 85281。虽然找到了 56065。

最佳答案

正如其他两个答案所指出的,您必须使用 std::getline,但我会这样做:

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

我所做的唯一真正的改变是我将提取包含在 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;
}

现在它变得像做一样简单:

Data d;

if (std::cin >> d)
{
    std::cout << "Yes! It worked!";
}

关于c++ - 读取带分隔符的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22290891/

相关文章:

c# - 使用 C# 调用返回结构数组的非托管 dll 函数

c++ - 如何计算出文件中 "columns"的个数?

java - 不使用 Java 创建实际文件的 FileInputStream

objective-c - ios从私网地址读取内容

node.js - 将查询参数序列化为文件名

c - getaddrinfo addrinfo 结果在堆栈或堆中

C++ 有效地跳过多行

c++ - QGraphicsItem只能在堆上创建?

c++ - 什么时候使用引用的dynamic_cast?

c - c中的注册函数