为啥 ofstream 在存储字符串的值时会避免前 4 个字符?

Posted

技术标签:

【中文标题】为啥 ofstream 在存储字符串的值时会避免前 4 个字符?【英文标题】:Why does ofstream avoids the first 4 character while storing the value of the string?为什么 ofstream 在存储字符串的值时会避免前 4 个字符? 【发布时间】:2021-07-28 22:10:52 【问题描述】:

我正在使用 ofstream 从用户那里获取输入类型字符串并将其放入一个名为 question.txt 的文件中。它不显示文件中的前 4 个字符..我也尝试过不放 cout

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, question);
cout<<question<<endl;
ofstream g("question.txt",ios::app);
g<<question<<endl;

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

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

【问题讨论】:

防火墙阻止我访问您的代码的链接。相反,发布minimal reproducible example。 文件中的前 4 个字符是什么?它们是 ASCII、UTF-8 还是 UTF-16?请使用文件前 16 个字节的十六进制转储来编辑您的帖子。 cin &gt;&gt; question 表示阅读1个字 刚刚编辑了这个问题.. 整个代码也带有粘贴 bin 链接 @ThomasMatthews 我刚刚编辑了代码……如果我输入“你好吗?” ,, 它输出“你是吗?” 【参考方案1】:

在这段代码中:

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 &gt;&gt; question 仅将用户输入的第一个字读入question,然后getline(cin, question) 再次将输入的其余部分读入question,覆盖其当前值。这就是您丢失输入的开头字符的原因。

这里需要去掉&gt;&gt;,例如:

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 &gt;&gt; ... 读入较早 输入,并且用户在该输入之后按下Enter,那么将有一个@ cin 的输入缓冲区中的 987654332@ 字符。如果您没有事先读入那个 '\n' 字符,std::getline() 将无法在此代码中工作。

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

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

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

鉴于:

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

无法按预期工作。 cin &gt;&gt; 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() 将按预期正确读取整个问题。

【讨论】:

我刚刚做了..我是这个网站的新手..不知道该怎么做

以上是关于为啥 ofstream 在存储字符串的值时会避免前 4 个字符?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 useRef 值在它是整数时会动态更新,但在它是字符串时会存储先前的值?

为啥在使用 statsmodels 预测测试值时会收到此 numpy 错误?

为啥在计算整数数组的最小值时会出现“实际或形式参数列表长度不同”的错误?

为啥 nameof() 在 Linq 表达式中给出一个模棱两可的调用警告,但当我使用与字符串相同的值时却没有?

为啥 C# 'is' 运算符在比较两个布尔值时会给出正确的结果,我应该使用它吗?

Swift Struct实例在更新它的值时会更改