为什么 ofstream 在存储字符串的值时避免了前 4 个字符?

问题描述

我使用 ofstream 从用户获取输入类型字符串并将其放入名为 question.txt 的文件中。它不显示文件中的前 4 个字符。

string question; 
cout<<"Enter Your Question: "<<endl;
cin>>question;
getline(cin,question);
cout<<question<<endl;
ofstream g("question.txt",ios::app);
g<<question<<endl;

上面的代码忽略字符串的前 4 个字符,然后打印其余的代码

string question; 
cout<<"Enter Your Question: "<<endl;
getline(cin,ios::app);
g<<question<<endl;

上面的代码(没有cin>>question)根本不允许用户输入..这个代码在if else语句中......当你把相同的代码放在其他地方时它可以工作,但它在这里不起作用出于某种原因

全码粘贴bin链接https://pastebin.com/yQrzZXxJ code starts from line 83

解决方法

在这段代码中:

string question; 
cout<<"Enter Your Question: "<<endl;
cin>>question; // <-- WRONG
getline(cin,question);
cout<<question<<endl;
ofstream g("question.txt",ios::app);
g<<question<<endl;

cin >> question 仅将用户输入的第一个单词读入 question,然后 getline(cin,question) 再次将输入的其余部分读入 question,覆盖其当前值。这就是您丢失输入的开始字符的原因。

你需要去掉这里的 >>,例如:

string question; 
cout<<"Enter Your Question: "<<endl;
getline(cin,question); // <-- USE BY ITSELF!
cout<<question<<endl;
ofstream g("question.txt",ios::app);
g<<question<<endl;

但是,您声称您已经尝试过此方法,但它根本不起作用。这意味着 cin 流未处于您期望开始的状态,因此 std::getline() 忽略了您想要的输入。

例如,如果您使用 cin >> ... 读取更早的输入,并且用户在该输入之后按了 Enter,那么将会有'\n' 的输入缓冲区中的 cin 字符。如果您没有事先读入该 '\n' 字符,则 std::getline() 在此代码中将不起作用。

例如:假设您提示用户输入一个数字,然后他们按 Enter。然后你提示问题。因此:

cin >> number;
...
cin >> question;
getline(cin,question)

会按预期工作(只是没有您想要的结果)。 cin >> number 会读入数字,将 '\n' 留在输入缓冲区中。然后 cin >> question 将跳过 '\n' 作为前导空格,并读入问题的第一个单词。然后 getline(cin,question) 会读入问题的其余部分,直到下一个 '\n'

鉴于:

cin >> number;
...
getline(cin,question)

不会按预期工作。 cin >> number 会读入数字,将 '\n' 留在输入缓冲区中。然后 getline(cin,question) 会在读入 '\n' 时立即停止阅读,将整个问题留在输入缓冲区中。

这可以解释您所看到的行为。

Why does std::getline() skip input after a formatted extraction?。要解决这个问题,您需要这样做:

cin >> number;
cin.ignore(numeric_limits<streamsize>::max(),'\n'); // <-- ADD THIS!
...
getline(cin,question);

现在 std::getline() 将按预期正确阅读整个问题。