0

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

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;
}

此方法似乎不喜欢“主题名称”之间的空格,并且它没有拾取,因此它不会运行 while 循环。有没有简单的方法可以解决这个问题?

4

2 回答 2

1

当我查看您的代码时,我注意到的第一个问题是;后面缺少分号

myfile >> string1但这只是一个语法错误。

您尝试使用的 while 循环只会在两个条件都为真时评估,因为您正在使用&&运算符。

正如@sftrabbit 所说>>,C++ 中的提取运算符会在输入缓冲区中留下一个换行符\n,然后在您尝试输入时

std::getline(myfile, string2) && myfile >> int1

第一个条件std::getline(myfile, string2)在获取换行符时没有问题,并且将评估为 true,但第二个条件myfile >> int1将评估为 false,因为它在期望整数时会得到一个字符。这就是为什么您的 while 循环不想执行的原因。

当您更改提取运算符时,您可以轻松解决此问题 myfile >> string1getline(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;
}

我希望这可以帮助你。

于 2013-05-07T02:06:15.377 回答
0

>>用into a提取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在下一次迭代中删除才能成功。

于 2013-05-06T23:59:41.903 回答