gpt4 book ai didi

c++ - 在循环中使用 stringstream

转载 作者:搜寻专家 更新时间:2023-10-31 00:52:43 25 4
gpt4 key购买 nike

如果这面墙过多,我的问题会在本页底部进行总结。无论如何,我正在尝试从包含原子及其类型列表的文件中读取行,格式如下:

   Li   O    Ti   La
1 24 8 5

此示例有四个元素和 38 个原子,但我正在编写我的代码以容纳任意数量的元素。不管内容如何,​​元素符号总是在一行,原子在下一行。我认为最好的方法是使用 getline 将每一行插入到一个字符串中,然后使用 stringstream 适本地解析这些字符串。但事实证明,任意大小的考虑对我来说是个问题。我尝试使用 stringstream:

#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;

int main() {
string line;
int num_elements;
struct Element {
string symbol;
int count;
};
Element* atoms_ptr = NULL; //to be allocated
ifstream myfile("filename");
getline(myfile, line);
num_elements = (int)(line.size()/5); //symbols in file have field width 5
atoms_ptr = new Element[num_elements];
for (int i=0; i<num_elements; ++i) {
stringstream(line) >> (*(atoms_ptr+i)).symbol; //does not work
}
getline(myfile, line);
for (int i=0; i<num_elements; ++i) {
stringstream(line) >> (*(atoms_ptr+i)).count; //does not work
}
...
return 0;
}

您可能已经意识到我的 stringstream 语句存在问题。不是将四个元素中的每一个都读入一次,而是将第一个元素读入四次。因此,我数组中每个条目的 .symbol 成员都被初始化为 Li。与原子数类似,.count 成员被初始化为 1。

通过以这种方式重构我的循环,我能够编写出按预期工作的东西:

int j = 3;
for (int i=0; i<num_elements; ++i) {
(*(atoms_ptr+i)).symbol = line.substr(j, 2);
j += 5;
cout << (*(atoms_ptr + i)).symbol << '\n';
}

但我不喜欢这个解决方案,因为它取决于确切的文件间距,不是特别可读,而且我仍然不知道如何正确使用 stringstream。

从根本上说,我认为问题是由于我在循环中使用了 stringstream。也许每次迭代都会重置字符串文件指针的位置?如果是这样,我需要一个解决方法。如果能提供任何帮助,我将不胜感激。提前致谢!

最佳答案

这应该可以解决问题

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

struct Element
{
std::string symbol;
int count;
};

int main()
{
std::ifstream myfile("test.txt");

std::vector<std::string> tokens(
(std::istream_iterator<std::string>(myfile)),
(std::istream_iterator<std::string>()));

myfile.close();

std::vector<Element> elements;

const size_t numEntries = tokens.size() / 2;

for (size_t i = 0; i < numEntries; i++)
{
elements.push_back({ tokens[i], std::stoi(tokens[i+ numEntries]) });
}

return 0;
}

一些解释:

它首先将您的文件内容读入一个字符串 vector (前半部分是元素名称,后半部分是计数)然后它遍历 vector 并将信息聚合到 Element 的 vector 中(途中将计数转换为整数)

关于c++ - 在循环中使用 stringstream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50955615/

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