从文本文件C ++加载结构的向量的奇怪问题

时间:2014-03-15 19:53:13

标签: c++ file-io vector struct

我目前正在尝试将文本中的数据加载到结构的向量中。它适用于第一行,然后死掉并打印出零,原因是我不知道的。

我的代码在下面,它非常简单,以及我正在阅读的文本文件。我很感激一些帮助,因为我无法弄清楚为什么这样做。

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <string>

using namespace std;

struct Symbol
{
    int type;
    string name;
};

int main()
{
    /************ VARS ***************/
    string line;
    int line_count;
    int increment;

    /************ Vector of Symbols ***************/
    vector<Symbol> symbols;

    cout << "Opening file..." << endl;

    ifstream file;
    file.open("symbols.txt");

    if(!file)
    {
        cout << "System failed to open file.";
    }

    while(file)
    {
        Symbol temp;
        getline(file, temp.name);
        file >> temp.type;
        symbols.push_back(temp);
        increment++;
    }
    //Just to test and see if its loading it correctly...
    for(int i = 0; i < symbols.size(); i++)
    {
                    cout << symbols[i].name << endl;
                    cout << symbols[i].type << endl;
    }
}

输入文件:

count
2
num
2
myFloat
4
myDouble
5
name
6
address
6
salary
5
gpa
4
gdp
5
pi
5
city
6
state
6
county
6
ch
0
ch2
0
ID
1
studentID
1
max
3
max2
3
greeting
6
debt
5
age
2

输出:

Opening file...
count
2

0   

1 个答案:

答案 0 :(得分:1)

您正在使用的循环没有考虑到最后一次格式化提取在流中留下换行的事实。当std::getline()第二次运行时,它将找到换行符并停止提取字符(因此没有任何内容插入temp.name。流将std::ios_base::failbit设置为其流状态,并进一步尝试执行输入失败。

必须清除换行符。您可以使用std::ws执行此操作。此外,您可以按如下方式重构循环:

for (Symbol temp;
     std::getline(file >> std::ws, temp.name) && file >> file.type; )
{
     symbols.push_back(temp);
     increment++;
}

进一步观察我发现你甚至不需要std::getline()。只需使用operator>>()提取

即可
for (Symbol temp; file >> temp.name >> temp.type; )
{
     symbols.push_back(temp);
     increment++;
}