我试图将以下文本文件读入不同的变量:
title
subject name
123
subject2 name
124
subject3 name
125
到目前为止,我一直在使用以下代码
ifstream myfile;
myfile.open("filename.txt");
......etc
myfile >> string1
while(myfile >> string2 && myfile >> int1){
cout << "read string " << string2 << "and int " << int1 << endl;
}
这种方法似乎不喜欢&#34;主题名称&#34;之间的空格。并且它没有拾取,因此它不会运行while循环。有没有一种简单的方法可以解决这个问题?
答案 0 :(得分:1)
我看到你的代码时注意到的第一个问题是
之后丢失的分号;
myfile >> string1
但这只是一个语法错误。
您尝试使用的while循环只会在两个条件都为真的情况下进行评估,因为您使用的是&&
运算符。
正如@sftrabbit所说的C ++中的提取运算符>>
在输入缓冲区中留下一个新的行字符\n
,然后在您尝试输入
std::getline(myfile, string2) && myfile >> int1
第一个条件std::getline(myfile, string2)
在获取新行字符时没有问题并且将评估为true,但是第二个条件myfile >> int1
将评估为false,因为它将获得一个字符它期待一个整数。这就是你的while循环不想执行的原因。
更改提取运算符时,可以轻松解决此问题
myfile >> string1
getline(myfile, string1);
因为getline会留下空的输入缓冲区。
但是那时你会遇到另一个问题。 while循环只会再次执行,因为输入缓冲区中有\ n,因此您需要myfile.ignore(numeric_limits<streamsize>::max(), '\n');
。
你的最终代码应该像这样:
int main ()
{
ifstream myfile;
string string1;
string string2;
int int1;
myfile.open("filename.txt");
getline(myfile, string1);
while(getline(myfile, string2) && myfile >> int1)
{
myfile.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "read string " << string2 << " and int " << int1 << endl;
}
return 0;
}
我希望这会对你有所帮助。
答案 1 :(得分:0)
将>>
提取到std::string
将读取到下一个空格。所以,是的,它只会从该行中提取一个单词。如果要提取整行,请使用std::getline
。您可以按如下方式合并它:
while(std::getline(myfile, string2) &&
myfile >> int1) {
myfile.ignore();
cout << "read string " << string2 << "and int " << int1 << endl;
}
ignore
是必需的,因为提取到int
会在流中留下以下\n
个字符。需要在下一次迭代中删除以下std::getline
才能成功。