使用制表符和空格读入文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用制表符和空格读入文件相关的知识,希望对你有一定的参考价值。
我有这种格式的文本文件:
Petroleum Engineering 94600 175500 Marine Engineering 73900 123200 Economics and Mathematics 60000 122900 Geophysics 54100 122200 Cognitive Science 54000 121900
我所拥有的是课程名称,平均早期职业薪酬和中期职业薪酬,所有这些都由标签分隔。具有多个单词的课程名称由空格分隔。
我想阅读课程名称并将其放在一个变量中,第一个支付在第二个变量中,第三个支付在第三个变量中。
int main(){
ifstream in;
in.open("Salaries.txt");
string course;
int mid;
int avg;
if (in.fail()){
cout<< "failed to open file";
exit(1);
}
while(!in.eof()){
in >> course >> avg >> mid;
cout << course<<endl;
}
in.close();
}
当我编译这段代码时,它什么都不输出,程序不会退出或终止。
评论中有人指出不推荐使用eof()
,所以我试着这样做:
while(in >> course >> sm >> lg){
cout << course << endl;
}
该过程退出而不向屏幕输出任何内容。我在输入文件上尝试了它,看起来像这样:
NCORES 1 NEW 0 CORE 100 INPUT 5000 CORE 20
它接受字符串并将其放入一个变量中,然后获取数字并将其放入另一个变量中,并输出正确的输出。所以问题是原始文件中cours名称中的单词之间的空格,我不知道如何解释。
虽然你的代码确实有其他问题,但你遇到的问题是operator>>
为string
在它遇到的第一个空白处停止阅读的事实。这意味着在第一行,它将Petroleum
读入course
,然后尝试将Engineering
读入avg
。由于avg
是一个数字,这不起作用,因此转换失败。从那里,所有进一步尝试从流读取失败。
要解决这个问题,您可能希望使用std::getline
来阅读课程名称。它允许您指定将结束其读取的字符串的字符。在这种情况下,您显然希望为该参数传递制表符(' '
)。
如果我这样做,我可能会将这三个项放入一个结构中,并为该结构重载operator>>
:
struct course {
std::string name;
long early_pay;
long mid_pay;
friend std::istream &operator>>(std::istream &is, course &c) {
if (std::getline(is, c.name, ' ')) {
std::string temp;
std::getline(is, temp, ' ');
c.early_pay = std::stol(temp);
std::getline(is, temp);
c.mid_pay = std::stol(temp);
}
return is;
}
};
然后读取数据并打印出课程名称将如下所示:
int main() {
std::istringstream input(
R"(Petroleum Engineering 94600 175500
Marine Engineering 73900 123200
Economics and Mathematics 60000 122900
Geophysics 54100 122200
Cognitive Science 54000 121900 )");
course c;
while (input >> c)
std::cout << c.name << '
';
}
使用std::getline()
从文件中读取行,并使用std::istringstream
来解析每一行。然后,您可以使用std::getline()
从每行读取制表符分隔的字符串。例如:
int main() {
ifstream in("Salaries.txt");
if (!in.is_open()) {
cout<< "failed to open file";
exit(1);
}
string line course;
int mid, avg;
while (getline(in, line)) {
istringstream iss(line);
getline(iss, course, ' ');
iss >> avg >> mid;
cout << course << endl;
}
return 0;
}
以上是关于使用制表符和空格读入文件的主要内容,如果未能解决你的问题,请参考以下文章