2015-06-23 6 views
0

Я пишу программу для своего класса, которая принимает текстовый файл и имеет каждую строку в назначенном тексте. Проблема, с которой я сталкиваюсь, заключается в том, что когда я использую 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 

    } 
} 
+0

Вы должны добавить тег 'C++' и проверить строку в верхней части кода, которая выглядит как бродяга. (например, 'гараж populategarage() {гараж tg; // временный гараж string command_prompt;') –

+0

Остальная часть этого кода, похоже, работает нормально, по какой-то причине с помощью строки .drive он просто полностью пропускает его как вход и запускает петля снова, заставляя дисплей отключиться одним местом. Я что-то пропустил, насколько это касается линии getline, или это выглядит правильно? –

ответ

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... 
}