用分隔符读取文件

时间:2014-03-10 01:59:37

标签: c++ file-io struct

如何读取文件中的行并将该行的特定段分配给结构中的信息?如何在空行处停止,然后再继续直到文件结束?

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

假设我有结构:

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

但文件中的行格式如下:

20

85086,Phoenix,Arizona
56065,Minneapolis,Minnesota

85281
56065

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

3 个答案:

答案 0 :(得分:5)

正如其他两个答案所指出的那样,你必须使用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!";
}

答案 1 :(得分:2)

您可以使用<string>中的getline函数,如下所示:

string str;                      // This will store your tokens
ifstream file("data.txt");

while (getline(file, str, ',')   // You can have a different delimiter
{
     // Process your data

}

您也可以使用stringstream:

stringstream ss(line);           // Line is from your input data file
while (ss >> str)                // str is to store your token
{
     // Process your data here
}

这只是一个暗示。希望它可以帮到你。

答案 2 :(得分:0)

您需要的只是功能std::getline

例如

std::string s;
std::getline( YourFileStream, s, ',' );

要将字符串转换为int,您可以使用函数std::stoi

或者您可以读取整行,然后使用std :: istringstream使用相同的函数std :: getline提取每个数据。例如

Data d = {};

std::string line;

std::getline( YourFileStream, line );

std::istringstream is( line );

std::string zipCode;

std::getline( is, zipCode, ',' );

d.zipCode = std::stoi( zipCode );

std::getline( is, d.city, ',' );
std::getline( is, d.state, ',' );