gpt4 book ai didi

c++ - 如何从文件中读取包含子列表的列表?

转载 作者:行者123 更新时间:2023-11-30 04:29:03 25 4
gpt4 key购买 nike

结构非常简单:

  1. 要点
    1. 列表项 - 5
    2. 列表项 - 6
    3. ...
  2. 要点
    1. 列表项 - 2
    2. 列表项 - 3
    3. ...

为了便于阅读,我添加了一些分隔符,这是实际文件:

>Point one
item 1 | 150
item 2 | 20
>Point two
item 1 | 150
item 2 | 10

我写了一个 C++ 函数来读取它。但是我在自己的逻辑某处纠结了,犯了错误。能帮我找到吗?

  ifstream fileR("file.txt"); 

int i = 0;
getline(fileR, sTemp);
do {
if(!sTemp.empty() && sTemp[0]==DELIM){
R[0][i] = sTemp.substr(1);
i++;
}else{
j = 0;
do {
if(!sTemp.empty() && sTemp[0] != DELIM){
string::const_iterator pos = find(sTemp.begin(), sTemp.end(), '|');
string name(sTemp.begin(), pos);
string a_raw(pos + 1, sTemp.end());
a_raw = trim(a_raw);
double amount(atof(a_raw.c_str()));
R[j+1][i].set(trim(name), amount);
j++;
}else{
break;
}
}while(getline(fileR, sTemp));
}
}while(getline(fileR, sTemp));

读取值传递到哪里并不重要,因为我试图简化这个函数,因为它实际上是一些带有动态数组的容器。我已经对它们进行了测试,它们工作正常。所以阅读有问题。它可以很好地读取第一个值,但之后会造成某种困惑。
如果您认为我的尝试完全是一场灾难,我欢迎您提供有关如何实现真正有效功能的提示。

编辑:
我睡得很好,我已经修好了。这是一个工作版本:

  bool read =  true;
for(int i = 0; i<n; i++) {
if(read){getline(fileR, sTemp);}else{ read = true; }
if(!sTemp.empty() && sTemp[0]==DELIM){
R[i].setName(sTemp.substr(1));
i--;
}else{
R[i].toFirstSubpoint();
do {
if(!sTemp.empty() && sTemp[0] != DELIM){
string::const_iterator pos = find(sTemp.begin(), sTemp.end(), '|');
string name(sTemp.begin(), pos);
string a_raw(pos + 1, sTemp.end());
a_raw = trim(a_raw);
double amount(atof(a_raw.c_str()));
R[i].setSubpoint(trim(name), amount);
R[i].toNextSubpoint();
}else{
read = false;
break;
}
}while(getline(fileR, sTemp));
}

我最重要的错误是我忘记了如果在检查条件后循环转到下一个索引并且不执行它的其他(其他)条件。

下面的答案实际上是更好的方法,它更简单、更容易理解,但这次我不能使用 vector ,我猜我的脚本应该更快一些,因为它不使用它们。无论如何,下次遇到类似情况时,我将使用以下解决方案。

最佳答案

你可能应该考虑使用像 boost::spirit 这样的解析库,但是如果文件格式是可选的,你可以做很多事情来使解析更容易,而无需这些措施,

考虑以下日期布局

MainPoint1 iname1 ivalue1 iname2 ivalue2 iname3 ivalue3
MainPoint2 iname1 ivalue1 iname2 ivalue2

这可以很容易地加载以下内容。

struct item{
std::string name;
double value;
};

std::ostream& operator<<(std::ostream& os, const item& i)
{
return os << i.name << " " << i.value;
}

std::istream& operator>>(std::istream& is, const item& i)
{
return is >> i.name >> i.value;
}

struct point{
std::string value;
std::vector<item> items;
};


std::istream& operator>>(std::istream& is, point& p)
{
std::string line;
std::getline(is, line);
std::stringstream ss(line);
ss >> p.value;
p.assign(
std::istream_iterator<item>(ss),
std::istream_iterator<item>());
return is;
}


std::ostream& operator<<(std::istream& os, const point& p)
{
os << p.value << " ";
std::copy(p.item.begin(), p.items.end(),
std::ostream_iterator<item>(os, " "),
return os;
}

int main()
{
/*
** Deserailise
*/
std::ifstream in_file("infile.dat");
std::vector<point> points(
std::istream_iterator<point>(in_file),
std::istream_iterator<point>());


/*
** Serailise
*/
std::ofstream out_file("outfile.dat");
std::copy(points.begin(), points.end()
std::ostream_iterator<points>(out_file, "\n"));
}

这完全未经测试和编译,但从概念上讲它应该可以工作。

编辑:更改代码以满足具有名称和值的项目。

关于c++ - 如何从文件中读取包含子列表的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9693958/

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