使用函数,数组和结构的输入文件的getline

时间:2015-06-23 00:19:27

标签: c++ getline

我正在为我的班级编写一个程序,它接受一个文本文件并分配文本中的每一行。我遇到的问题是,当我使用getline()时,它完全跳过输入。从我读过的所有内容我觉得我做得对,但显然我错过了一些东西。这只是代码的一小部分...如果你需要整个事情我可以发布它。谢谢你提前给大家的帮助。

garage populategarage()
{
garage tg; //temporary garage
string instruction_prompt;

initialize_garage(tg);
ifstream inputFile;

inputFile.open("garage-input-file.txt");

for (int i = 0; i < NUM_OF_VEHICLES; i++)
{
    inputFile >> tg.vehicles[i].category;


    if (tg.vehicles[i].category == "\0")
        i = NUM_OF_VEHICLES;
    else
    {
        inputFile >> tg.vehicles[i].make;

        inputFile >> tg.vehicles[i].model;

        inputFile >> tg.vehicles[i].color;

        inputFile >> tg.vehicles[i].year;

        inputFile >> tg.vehicles[i].trans;

        inputFile >> tg.vehicles[i].cylinder;

        getline(inputFile, tg.vehicles[i].drive); //This is my problem

    }
}

1 个答案:

答案 0 :(得分:0)

您没有显示任何示例输入或结果是什么,但从您的描述中看起来似乎每个值都出现在它自己的行上。那是对的吗?在这种情况下,getline调用可能会获取上一个换行符(从您阅读cylinder时开始),并返回一个空字符串。

如果您的值显示在单独的行中,则应该为每个值使用getline。您可以将任何类型的此行为包装到模板函数中 - 这很简单:

template <class T>
istream & readValue( istream & s, T & value )
{
    string line;
    if( getline( s, line ) )
    {
        istringstream iss( line );
        iss >> value;
    }
    return s;
}

如果您的文件包含每个条目的单个行,那么通常最好对整行使用getline,然后从istringstream读取单个值。

for (int i = 0; i < NUM_OF_VEHICLES; i++)
{
    string line;
    if( !getline( inputFile, line ) ) break;
    istringstream iss( line );

    iss >> tg.vehicles[i].make;
    iss >> tg.vehicles[i].model;
    // etc...
}