在下面的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/

10-13 08:24