是否可以迭代文本文件行并使用stringstream来解析每一行?

问题描述:

我想要做的是在使用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 

通缉输出:

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

我该如何有效地生产这个?

  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>>从中获得intdouble值。

#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