为什么 ofstream 在存储字符串值时会避开前 4 个字符?
Why does ofstream avoids the first 4 character while storing the value of the string?
我正在使用 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>>问题)根本不允许用户输入..这段代码在 if else 语句中...当你把相同的代码放在其他地方时它可以工作,但它不出于某种原因在这里工作
整个代码粘贴箱link: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输入后,cin
的输入缓冲区中将有一个 '\n'
字符。如果您没有事先读入那个 '\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()
将按预期正确读出整个问题。
我正在使用 ofstream 从用户获取输入类型字符串并将其放入名为 question.txt 的文件中。它不显示文件中的前 4 个字符..我也试过不放 cout< 以上代码忽略字符串的前 4 个字符,然后打印其余代码。 上面的这段代码(没有 cin>>问题)根本不允许用户输入..这段代码在 if else 语句中...当你把相同的代码放在其他地方时它可以工作,但它不出于某种原因在这里工作 整个代码粘贴箱link:https://pastebin.com/yQrzZXxJ
code starts from line 83string question;
cout<<"Enter Your Question: "<<endl;
cin>>question;
getline(cin, question);
cout<<question<<endl;
ofstream g("question.txt",ios::app);
g<<question<<endl;
string question;
cout<<"Enter Your Question: "<<endl;
getline(cin, question);
cout<<question<<endl;
ofstream g("question.txt",ios::app);
g<<question<<endl;
在此代码中:
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输入后,cin
的输入缓冲区中将有一个 '\n'
字符。如果您没有事先读入那个 '\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()
将按预期正确读出整个问题。