0

我有一个带有名称和等级的 .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”语句的一部分?我的一个朋友有这个确切的东西,但他并没有流产。

4

1 回答 1

1

首先,将循环更改为:

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

其次,将整行提供给字符串流可能要简单得多,然后从那里读取两部分:

stringstream convert(line);

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

第三,如果你想检查小写字母,你islower比比较像 96 和 123 这样的幻数要好得多。不过我不会那样检查。如果你想检查一个空行,最好直接做,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从流中读取和转换 a,对于空行将失败。

于 2013-02-21T04:43:36.017 回答