在下面的C++代码中,我意识到gcount()
返回的数字比我想要的要大,因为getline()
占用了最后的换行符,但没有将其发送到输入流。
不过,我仍然不了解该程序的输出。对于输入“Test\n”,为什么会得到“est\n”?我的错误如何影响字符串的第一个字符,而不是在字符串末尾添加多余的垃圾?程序的输出与字符串在调试器中的显示方式(“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/