Можно ли перебирать строки текстового файла и использовать stringstream для разбора каждой строки?
То, что я пытаюсь сделать, это читать из текстового файла каждую строку при разборе с использованием библиотеки sstream. Я запустил программу, но она застряла в цикле.
Программа:
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
Как я могу эффективно произвести это?
2 ответа
Не используйте цикл
eof
, Почему iostream::eof внутри условия цикла считается неправильным?Читайте файл построчно. Читать файл построчно
Разбейте строку каждой строки, используя
,
в качестве сепаратора. Разбить строку в 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
закрыт в своем деструкторе.