逐行处理文件并解析该行以获取单独的变量

时间:2014-10-17 01:28:24

标签: c++ file parsing line

所以我是C ++的新手,我正在尝试一个看起来像这样的文件:

0 A
1 B
2 C
3 D
4 E

我需要逐行处理这个文件,然后在每一行我需要从行中取两个数字并将它们放在一个地图中,其中数字是一个名称为a的节点的ID# string这样0就是我地图中节点A的关键。

我认为我逐行排队,但即使这样也有点不稳定。

这就是我所拥有的:

bool read_index(map<long, string> &index_map, string file_name)
{
    //create a file stream for the file to be read
    ifstream index_file(file_name);

    //if file doesn't open then return false
    if(! index_file.is_open())
        return false;

    string line;
    //read file
    while(! index_file.eof())
    {
        getline(index_file,line);
        stringstream ss(line);
        while(ss)
        {
            //process line?
        }
    }

    //file read
    return true;
}

2 个答案:

答案 0 :(得分:2)

如果字符串中没有空格,那么您可以忽略换行符并只提取标记:

void read_index(std::istream & infile, std::map<long, std::string> & index_map)
{
    long n;
    std::string token;

    while (infile >> n >> token) { index_map[n] = std::move(token); }
}

在调用此函数之前,应单独进行错误检查以打开文件。否则你的功能太多了。

如果您有任意字符串,可能包含空格,则需要使用getline

    for (std::string line; std::getline(infile, line); )
    {
        std::istringstream iss(line);

        long n;
        std::string token;
        if (iss >> n >> std::ws && std::getline(iss, token))
        {
            index_map[n] = std::move(token);
        }
        else
        {
            // unparsable input line
        }
    }

正如您所看到的,基于行的处理的好处是您还可以处理无效行并跳过这些行。第一个纯粹基于令牌的代码一旦无法识别令牌就会一劳永逸地停止。

答案 1 :(得分:0)

您滥用eof()。尝试更像这样的东西:

bool read_index(map<long, string> &index_map, string file_name)
{
    //create a file stream for the file to be read
    ifstream index_file(file_name);

    //if file doesn't open then return false
    if(!index_file)
        return false;

    string line;
    //read file
    while(getline(index_file, line))
    {
        stringstream ss(line);
        long n;
        std::string token;

        if (ss >> n >> token)
        {
            //process line
            index_map[n] = token; 
        }
        else
        {
            // error do something
        }
    }

    //file read?
    return !file.fail();
}