Как разделить строку в 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()