是否可以迭代文本文件行并使用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
我该如何有效地生产这个?
答
不要使用
eof
循环。 Why is iostream::eof inside a loop condition considered wrong?逐行读取文件。 Read file line by line
将
,
作为分隔符将每行的字符串分开。 Split a string in C++?创建第二和第三串
std::stringstream
对象,并使用operator>>
从中获得int
和double
值。
答
#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
。