c++ - 为什么我的字符串的开头消失了?

标签 c++ string vector cout

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

相关文章:

python - Tensorflow——自定义操作——将参数作为可变对象传递(如通过引用传递)

java - 无法让字符串compareTo方法工作

python - Python多处理中的字符串参数

java - Berkeley DB java版支持保存 vector 吗

python - 使用 Boost.python 将 Python 列表传递给 C++ 向量

c++ - 错误 : cannot increment value of type 'char [6]'

c++ - 来自tensorrt的 "nvinfer.h"位于哪里?

c++ - 为什么在 C++ 中的函数内创建对象是一种不好的做法?

java - Java中打印两个DNA字符串之间对应的数字串

c++ - 实现 CRTP 并发出 "undefined reference"