在下面的 C++ 代码中,我意识到 gcount()
返回的数字比我想要的要大,因为 getline()
消耗了最后一个换行符但没有t 将其发送到输入流。
不过,我仍然不明白程序的输出。对于输入“Test\n”,为什么我得到“est\n”?为什么我的错误会影响字符串的 first 字符,而不是在末尾添加不需要的垃圾?为什么程序的输出与字符串在调试器中的显示方式不一致(如我所料,“Test\n”)?
#include <fstream>
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main()
{
const int bufferSize = 1024;
ifstream input( "test.txt", ios::in | ios::binary );
vector<char> vecBuffer( bufferSize );
input.getline( &vecBuffer[0], bufferSize );
string strResult( vecBuffer.begin(), vecBuffer.begin() + input.gcount() );
cout << strResult << "\n";
return 0;
}
最佳答案
我也复制了这个结果,Windows Vista,Visual Studio 2005 SP2。
当我弄清楚到底发生了什么时,我会更新这篇文章。
编辑:好的,我们开始吧。问题(以及人们得到的不同结果)来自\r。您调用 input.getline
并将结果放入 vecBuffer 会发生什么。 getline 函数去掉了\n,但保留了\r。
然后您将 vecBuffer 传输到一个字符串变量,但是使用来自输入的 gcount 函数,这意味着您将得到一个字符太多,因为输入变量仍然包含\n,而 vecBuffer 不包含。
结果 strResult 是:
- strResult "Test"
[0] 84 'T' char
[1] 101 'e' char
[2] 115 's' char
[3] 116 't' char
[4] 13 '␍' char
[5] 0 char
然后打印“Test”,然后是回车符(将光标放回行首)、空字符(覆盖 T),最后是\n,它正确地将光标放在新线路。
因此您要么必须去除\r,要么编写一个函数直接从 vecBuffer 获取字符串长度,检查空字符。
关于c++ - 为什么我的字符串的开头消失了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1039627/