2015-03-31 1 views
0

Это моя программа. Предполагается читать каждую строку из входного файла и отображать на консоли в аккуратном формате. Однако getline только считывает первую строку.Функция getline только считывает первую строку

#include <iostream> 
#include <fstream> 
#include <string> 
#include <iomanip> 
#include <sstream> 
using namespace std; 

int main(int argc, char *argv[]){ 
    ifstream inFile; 
    string state, quantityPurchased, pricePerItem, itemName;  
    inFile.open("lab11.txt"); 
    if (inFile.fail()){ 
     perror ("Unable to open input file for reading"); 
     return 1; 
    } 
    string line; 
    istringstream buffer; 
    while(getline(inFile, line)){ 
     buffer.str(line); 
     buffer >> state >> quantityPurchased >> pricePerItem >> itemName; 

     cout << left << setw(2) << state << " "; 
     cout << setw(15) << itemName << " "; 
     cout << right << setw(3) << quantityPurchased << " "; 
     cout << setw(6) << pricePerItem << endl; 
    } 
} 

Входной файл выглядит следующим образом:

TX 15 1.12 Tissue 
TX 1 7.82 Medication 
TX 5 13.15 Razors 
WY 2 1.13 Food 
WY 3 3.71 Dinnerware 

Но он показывает, как это (Перед тем, как организовано):

TX 15 1.12 Tissue 
TX 15 1.12 Tissue 
TX 15 1.12 Tissue 
TX 15 1.12 Tissue 
TX 15 1.12 Tissue 

ответ

2

Буфер не удается извлечь после второго цикла, потому что вы не очистили биты состояния. Сделайте это:

buffer.clear() 
buffer.str(line); 

Вы можете увидеть это, добавив некоторый выход к коду:

std::cout << "EOF: " << buffer.eof() << std::endl; 

после первого раза через ваш цикл, поток с дойдет до конца строки ввода и EOF бит будет установлен. Сброс строки в начале следующего цикла не сбрасывает этот бит, поэтому он все равно будет установлен. Когда вы пытаетесь извлечь второй раз, поток думает, что он уже находится в конце файла и думает, что ему нечего читать, поэтому он рано выходит. Очистка бит состояния исправляет это.

+0

О, большое вам спасибо. –