Как разделить строку в txt-файле на компоненты C++

Я пытаюсь прочитать файл списка соединений (или текстовый) и разделить его на слова. Пока я пробовал приведенный ниже код, но не могу избавиться от ошибок. Есть идеи?

текст, который я пытаюсь прочитать, выглядит так:

V1 1 0 12
R1 1 2 1000
R2 2 0 2000
R3 2 0 2000
using namespace std; 

int main() {
    ifstream Netlist;

    string line;
    string componentName;
    int node1,node2;
    double value;
    while(getline(Netlist, line)) {
        stringstream ss(line>>componentName >> node1>> node2>>value);
        cout<<"Component name:" << componentName<< endl;
        cout<<"Node1:" << node1<< endl;
        cout<<"Node2:" << node2<< endl;
        cout<<"Value:" <<value << endl;
    }

    return 0;
}

3 ответа

Почти готово. Инициализироватьstringstream с line содержание:

stringstream ss(line);

А потом вытащить из него данные:

ss >> componentName >> node1 >> node2 >> value;

Кроме того, вы, вероятно, хотели открыть свой файл, передав путь к Netlist ctor.

Это вся программа, и она отлично работает:

#include <iostream>
#include <fstream>

int main()
{
    std::ifstream netlist("netlist.txt");
    if (!netlist.is_open())
    {
        std::cerr << "Failed to open netlist.txt." << std::endl;
    }

    std::string componentName;
    int node1 = 0;
    int node2 = 0;
    double value = 0.0;
    while (netlist.good())
    {
        netlist >> componentName >> node1 >> node2 >> value;

        std::cout << "Component name: " << componentName << std::endl;
        std::cout << "Node1: " << node1 << std::endl;
        std::cout << "Node2: " << node2 << std::endl;
        std::cout << "Value: " << value << std::endl;
    }

    return 0;
}

Если вы читаете из файла, вы можете прочитать файл напрямую. Вам не нужно читать строчку, а затем пытаться ее прочитать.

Что вы пропустили:

  • открытие файла: std::ifstream netlist("netlist.txt");
  • проверка, действительно ли файл открыт: !netlist.is_open()
  • просто читая из потока: netlist >> componentName >> node1 >> node2 >> value;Примечание: это также должно работать с ss как только вы инициализировали его строкой: std::stringstream ss(line);

Есть одно предостережение: при чтении std:: string из потока вы всегда будете читать одно слово. Это работает в вашем случае, но вы должны помнить об этом.

Сначала вам нужно открыть файл, чего в приведенном вами примере не происходит:

Netlist.open("test.txt");

Затем вам нужно провести рефакторинг кода вашего строкового потока, поскольку он неверен.

stringstream ss(line);
ss >> componentName >> node1 >> node2 >> value;

Всегда полезно проверить, был ли файл открыт с помощью:

Netlist.is_open()

Живой образец

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