c++ - 在 C++ 中读取带有空格的文本

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

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

最佳答案

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

之后

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

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

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

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

第一个条件std::getline(myfile, string2)获取换行符没有问题并且会评估为真,但是第二个条件 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;
}

希望对你有帮助

关于c++ - 在 C++ 中读取带有空格的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16409107/

相关文章:

c - fwrite 是否在内部调用任何锁?

python - 如果文件为空,如何跳过它们

c++ - 如何从文本文件中取出每一行并对它们进行平均?

c++ - 如何在 C++ 中打开文件而不删除其内容且不附加它?

java - 在 Android 5.0.1_r1 中将 Intent 从 C++ 发送到 Java

c# - Unicode 字符串和 FreeHGlobal 问题?

c++ - 我可以声明一个模板只接受具有同质签名的函数吗?

C++ 从函数返回双指针....怎么了?

c++ - 删除文件而不是将其标记为删除

c++ - 通过 std::ifstream 从字符串中获取每个值