C ++ substring似乎指向了错误的位置

时间:2014-12-30 15:38:17

标签: c++ string substr

我正在用C ++阅读文本文件。 由于我是C ++的新手,我添加了一堆" cout"陈述以了解事物的行为方式。 我得到了一个输出,我没有找到任何解释,希望有人可以指点我一些相关的文字。

  1. 我读了一行
  2. 打印行
  3. 打印" line"中的前2个字符与" substr()"
  4. 将该行复制到工作区(" mybuffer")
  5. 打印我工作区的子字符串,长度为10个字符
  6. 问题: (a)(3)的输出似乎是一个转义序列(不可打印的字符)。如果我将子串的长度从2更改为4,我得到一个/。 (b)尽管" mybuffer"看起来正确(前两个字符确实是//),子字符串函数只返回七个(可打印的)字符。

    while( std::getline( file, line ) )
    {
    foundeq = 0;
    clearthis = 0;
    mybuffer = line;
    cout<< "line>>" << line<<"\n";
    cout<<"first 2 chars in line>>"<<line.substr(0,2)<<"\n";
    cout<< "mybuffer>>" << mybuffer<<"\n";
    cout<<"first 10 chars in mybuffer>>"<<mybuffer.substr(0,10)<<"\n";
    

    输出:

        line>>//--------------------------------------------------
        first 2 chars in line>>\357\273
        mybuffer>>//--------------------------------------------------
        first 10 chars in mybuffer>>//-----
    

    发生了什么事?

    提前感谢您的意见。

1 个答案:

答案 0 :(得分:5)

简答

您的文件以UTF-8编码,开头有Byte Order Mark

答案稍长

所以你的控制台正在以八进制打印前两个数字。 0357和0273. UTF-8 BOM的第三个字符是0277.据推测,当您在控制台中连续看到这三个字符时,它决定不打印它们。

另外,大概是文件中的第4个字符是/,它适合一个字节。