2017-01-04 2 views
0

То, что я пытаюсь сделать, читается из текстового файла в каждой строке при разборе с использованием библиотеки sstream. Я получил программу для запуска, но она застряла в цикле.Можно ли перебирать строки текстового файла и использовать stringstream для разбора каждой строки?

Программа:

string date; 
int time; 
float amount; 

ifstream testFile("test.txt"); 
string token; 
string line; 

while(!testFile.eof()) { 

    while(getline(testFile,token,',')){ 
     line += token + ' '; 
    } 
    stringstream ss(line); 
    ss >> date; 
    ss >> time; 
    ss >> amount; 

    cout << "Date: " << date << " "; 
    cout << "Time: " << time << " "; 
    cout << "Amount: " << amount << " "; 
    cout<<endl; 

    ss.clear(); 

}  
testFile.close(); 

test.txt:

10/12/1993,0800,7.97 
11/12/1993,0800,8.97 

Wanted выход:

Date: 10/12/1993 Time: 0800 Amount: 7.97 
Date: 11/12/1993 Time: 0800 Amount: 8.97 

Как я могу эффективно произвести это?

ответ

0
  1. Не используйте петлю, используя eof. Why is iostream::eof inside a loop condition considered wrong?

  2. Прочтите файл по строкам. Read file line by line

  3. Разделите строку каждой строки, используя , в качестве разделителя. Split a string in C++?

  4. Создать std::stringstream объекты второй и третьей строки и использовать operator>> для получения значений int и double из них.

0
#include <algorithm> 
#include <fstream> 
#include <iomanip> 
#include <iostream> 
#include <sstream> 
#include <string> 

using namespace std; 

int main() 
{  
    ifstream testFile("testdates.txt");  
    string line; 

    while(getline(testFile, line)){ 

     string date; 
     int time; 
     float amount; 

     std::replace(line.begin(), line.end(), ',', ' '); 

     stringstream ss(line); 

     ss >> date; 
     ss >> time; 
     ss >> amount; 

     cout << "Date: " << date << " "; 
     cout << "Time: " << std::setfill('0') << std::setw(4) << time << " "; 
     cout << "Amount: " << amount << " "; 

     cout << '\n'; 
    } 
} 

Вы должны читать построчно с помощью getline. Вы должны проверить возвращаемое значение этого, чтобы знать, когда нужно выйти (не !eof). Затем вы можете заменить все запятые пробелами и использовать существующий код анализа синтаксиса для чтения значений.

Обратите внимание на ss.clear() и testFile.close() не требуется, так как ss воссоздан на каждой итерации и testFile замкнута в деструкторе.

Смежные вопросы