gpt4 book ai didi

C++ - 解析具有多个定界符的 .text 文件,显示字符串

转载 作者:行者123 更新时间:2023-11-30 01:38:32 24 4
gpt4 key购买 nike

各位!我是 C++ 的新手,唉,我犯了愚蠢的错误。这是 .txt 文件内容的片段:

<tag attr1="value1" attr2="value2" ... >

我想要完成的是解析 .txt 文件,生成以下输出:

Tag: tag
name: attr1
value: value1
name: attr2
value: value2

到目前为止我所做的没有奏效(我的问题是定界符):

#include<iostream>
#include <sstream>
#include <string>
#include <vector>
#include <fstream>

using namespace std;

struct tagline{
string tag;
string attributeN;
string attributeV;

};

int main(){
vector<tagline> information;
string line;
tagline t;

ifstream readFile("file.txt");
while(getline(readFile,line)){
stringstream in(line);
getline(in,t.tag);
getline(in,t.attributeN,'=');
getline(in,t.attributeV,'"');
information.push_back(t);

}

vector<tagline>::iterator it = information.begin();

for(; it != information.end(); it++){
cout << "Tag: " << (*it).tag << " \n"
<< "name: " << (*it).attributeN << " \n"
<< "value: " << (*it).attributeV << " \n";

}
return 0;

}

我得到的只是在 .txt 文件中格式化的片段的简单显示:

<tag attr1="value1" attr2="value2" ... >

如果有人能提供帮助,我会很高兴。谢谢!

最佳答案

使用 HTML/XML 解析器会更好地处理这个问题(取决于您的文件实际包含的内容)。

也就是说,您没有正确解析这些行。

您对 getline(in,t.tag); 的第一次调用没有指定定界符,因此它会读取整行,而不仅仅是第一个单词。您必须改用 getline(in, t.tag, ' ');

此外,您的标签可以有多个属性,但您只读取和存储第一个属性,忽略其余属性。您需要一个循环来读取所有这些,以及一个 std::vector 来将它们全部存储到。

尝试更像这样的东西:

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <fstream>

using namespace std;

struct tagattribute {
string name;
string value;
};

struct tagline {
string tag;
vector<tagattribute> attributes;
};

int main() {
vector<tagline> information;
string line;

ifstream readFile("file.txt");
while (getline(readFile, line)) {
istringstream in(line);

tagline t;
tagattribute attr;

in >> ws;

char ch = in.get();
if (ch != '<')
continue;

if (!(in >> t.tag))
continue;

do
{
in >> ws;

ch = in.peek();
if (ch == '>')
break;

if (getline(in, attr.name, '=') &&
in.ignore() &&
getline(in, attr.value, '"'))
{
t.attributes.push_back(attr);
}
else
break;
}
while (true);

information.push_back(t);
}

vector<tagline>::iterator it = information.begin();
for(; it != information.end(); ++it) {
cout << "Tag: " << it->tag << "\n";

vector<tagattribute>::iterator it2 = it->attributes.begin();
for(; it2 != it->attributes.end(); ++it2) {
cout << "name: " << it2->name << "\n"
<< "value: " << it2->value << "\n";
}

cout << "\n";
}

return 0;
}

Live demo

或者,考虑编写一些自定义的 operator>> 来帮助解析,例如:

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <fstream>

using namespace std;

struct tagattribute {
string name;
string value;
};

istream& operator>>(istream &in, tagattribute &attr)
{
getline(in, attr.name, '=');
in.ignore();
getline(in, attr.value, '"');
return in;
}

struct tagline {
string tag;
vector<tagattribute> attributes;
};

istream& operator>>(istream &in, tagline &t)
{
tagattribute attr;

in >> ws;

char ch = in.get();
if (ch != '<')
{
in.setstate(ios_base::failbit);
return in;
}

if (!(in >> t.tag))
return in;

do
{
in >> ws;

ch = in.peek();
if (ch == '>')
{
in.ignore();
break;
}

if (!(in >> attr))
break;

t.attributes.push_back(attr);
}
while (true);

return in;
}

int main() {
vector<tagline> information;
string line;

ifstream readFile("file.txt");
while (getline(readFile, line)) {
istringstream in(line);
tagline t;

if (in >> t)
information.push_back(t);
}

vector<tagline>::iterator it = information.begin();
for(; it != information.end(); ++it) {
cout << "Tag: " << it->tag << "\n";

vector<tagattribute>::iterator it2 = it->attributes.begin();
for(; it2 != it->attributes.end(); ++it2) {
cout << "name: " << it2->name << "\n"
<< "value: " << it2->value << "\n";
}

cout << "\n";
}

return 0;
}

Live demo

关于C++ - 解析具有多个定界符的 .text 文件,显示字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47601002/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com