Можно ли перебирать строки текстового файла и использовать 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 ответа

  1. Не используйте цикл eof, Почему iostream::eof внутри условия цикла считается неправильным?

  2. Читайте файл построчно. Читать файл построчно

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

  4. Создайте 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 закрыт в своем деструкторе.

Другие вопросы по тегам