【发布时间】:2019-12-18 18:40:50
【问题描述】:
这是我第一次来这里!
我想做一些简单的事情,但对于我的生活,我似乎无法弄清楚......
我正在读取一个包含数据的文件。在这些数据中,我有对我有意义的特定标签。我称它们为“标签”,但在文件中,它是代表某事的文本字符串。我需要在找到每个标签之后提取这些标签以及其他两个字符串。标签和数据将存储在一个动态创建的结构中,因为我不知道要提取多少标签。所以我不能创建一个包含 100 个元素的结构,因为我可能只需要 50 个,就像我需要 150 个一样。
基本上,文件在循环中连续读取,直到遇到 EOF。当文件被解析时,当找到一个标签时,标签名称和相关的以下两个字符串被正确读取。然后我需要将它们存储在结构中。提取后,循环重新开始并一直重复标签和数据提取直到结束。一旦整个文件被读取并且所有标签都被提取到一个动态结构中,所有这些数据将被转储到一个文件中,然后可以刷新动态分配的内存。
有人告诉我要使用列表,但我似乎不知道如何使它起作用。理想情况下,一段功能性的代码会很有帮助。我在 C++ 中执行此操作(C 很好)。
我尝试过但未编译的示例:
struct MyStruct
{
char Tag[30];
char String1[30];
char String2[30];
};
int Counter;
std:list<MyStruct> MyList;
MyStruct Data;
std:list<MyStruct>::iterator it;
for( Counter = 0; Counter < 5; Counter++)
{
strcpy( Data.Tag, "Tag" );
strcpy( Data.String1, "String1" );
strcpy( Data.String2, "String2" );
MyList.push_back(Data);
}
it = MyList.begin();
while (it != MyList.end())
{
cout << "Tag: " << it->Tag << "First: " << it->String1 << "Second: " << it->String2 << endl;
it++;
}
谢谢!
【问题讨论】:
-
您到底为什么要为此使用
strcpy?为什么char[]而不是std::string?为什么所有变量名都大写? -
您面临的具体问题是什么?您是否坚持阅读文件?
std::list::push_back()已经在处理你的动态分配了。 -
您在编译代码时遇到了哪些错误?我同意 3Dave 对大写名称的评论。对于 std::string,继续使用 char[],当您的问题解决后,将 char[] 替换为 std::string。
-
如果需要动态数组,默认使用
std::vector。它具有与std::list相同的接口,但对于大多数操作而言,由于其实现方式,它具有更好的性能。std::list实际上只在少数特殊情况下需要,比如当您需要稳定的迭代器时。