正在从.txt中读取

Reading in from .txt

本文关键字:读取 txt      更新时间:2023-10-16

我有一个.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"语句的一部分?我的一个朋友有这样的东西,但他的并没有放弃。

第一点,将循环更改为类似的内容

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,这将在空行中失败。