用c ++中的空格读取文本

时间:2013-05-06 23:55:59

标签: c++ file ifstream

我试图将以下文本文件读入不同的变量:

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循环。有没有一种简单的方法可以解决这个问题?

2 个答案:

答案 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才能成功。