Как разделить строку в текстовом файле на компоненты C ++ - PullRequest
0 голосов
/ 24 февраля 2020

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

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

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 ]

2 голосов
/ 24 февраля 2020

Почти нет. Инициализируйте stringstream содержимым line:

stringstream ss(line);

, а затем извлеките из него данные:

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

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

0 голосов
/ 24 февраля 2020

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

#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 из поток, вы всегда будете читать одно слово. Это работает в вашем случае, но вы должны помнить об этом.

0 голосов
/ 24 февраля 2020

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

Netlist.open("test.txt");

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

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

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

Netlist.is_open()

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

...