gpt4 book ai didi

c++ - 从 .txt 读取

转载 作者:行者123 更新时间:2023-11-28 07:45:23 24 4
gpt4 key购买 nike

我有一个 .txt 文件,其中包含名称和等级,例如“emiltytaco 56”。在姓氏之后,有 3 个空行不应插入到我的 trie 和堆中。但是,代码在遇到空白行时被中止并被转储。这是插入函数

while(myfile.good())
{
getline(myfile, line);
name = line.substr(0,line.find("\t"));
stringstream convert((line.substr(line.find("\t")+1)));
convert >> grade;
if(name.at(0) > 96 && name.at(0) < 123)
{
insert(name, grade);
cout << name << " " << grade << endl;
}
}
myfile.close();

.close 是否应该是带有 if 的“else”语句的一部分?我的一个 friend 确实有这种情况,但他没有流产。

最佳答案

首先,将循环更改为:

while (getline(myfile, line)) {
// ...
}

其次,将整行输入字符串流并从那里读取两部分可能要简单得多:

stringstream convert(line);

std::getline(convert, name, '\t');
convert >> grade;

第三,如果你想检查小写字母,使用 islower 比与 96 和 123 这样的魔数(Magic Number)比较要好得多。我不会那样做检查尽管。如果您想检查空行,最好直接执行此操作,在阅读后立即使用 line.empty()。使用它,你最终会得到类似的东西:

while (getline(myfile, line))
if (!line.empty()) {
std::istringstream convert(line);
std::getline(convert(line, name);
convert >> grade;
insert(name, grade);
std::cout << name << " " << grade << "\n";
}

但除此之外还有一步:由于名称和等级(显然)相关,我可能会为它们定义一个类,并编写一个提取器以从流中获取该类型的对象:

class whatever { 
std::string name;
int grade;

friend std::istream &operator>>(std::istream &is, whatever &w) {
std::getline(is, w.name, '\t');
is >> w.grade;
is.ignore(4096, '\n');
return is;
}
};

有了它,我们可以更简单地从文件中读取数据:

whatever w;

while (myfile >> w) {
insert(w);
std::cout << w.name << " " << w.grade << "\n";
}

请注意,在这种情况下,我们根本不必显式检查空行——我们只需检查是否可以从流中成功读取和转换whatever,这将空行失败。

关于c++ - 从 .txt 读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14994207/

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