2013-02-21 65 views
0

我有一个名称和等级如“emiltytaco 56”的.txt文件。在姓氏后面,有3个空行,不应该插入到我的特里和堆中。但是,当代码空白时,代码被中止并转储。这是插入功能从.txt读入

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?我的一个朋友有这个确切的事情,但他不堕胎。

回答

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,这会导致空白行失败。