You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中读取单个字符后tellg()返回值跳变的原因解析

问题描述

给出以下C++代码:

#include <iostream>
#include <fstream>

int main()
{
    std::ifstream inputFile;

    inputFile.open("test.txt");

    char buffer;

    for (int i = 0; i < 9; ++i)
    {
        std::cout << "tellg: " << inputFile.tellg() << "   ";

        inputFile >> buffer;

        std::cout << "buffer: " << buffer << std::endl;
    }

    inputFile.close();

    return 0;
}

当test.txt内容为连续字符asdfghjkl时,程序输出符合预期;但将test.txt内容改为:

asdfgh  
jkl  

(jkl移至新行)后,程序输出中tellg()出现从0跳至2、7跳至9的跳变情况。请问该行为的原因是什么?

原因解析

这种跳变由两个核心因素导致:

  1. >>提取运算符会自动跳过空白字符
    std::ifstream的>>运算符默认以“跳过前导空白”的逻辑读取数据,空格、换行符、制表符等空白字符都会被直接跳过,不会被读取到buffer中。当文件指针指向空白字符时,>>会持续移动指针,直到找到第一个非空白字符才完成读取操作。

  2. 换行符的多字节存储特性
    在Windows系统中,换行符以\r\n两个字节的形式存储;即便在Linux/macOS系统中,若文件中同时存在空格和换行,也会形成多字节的空白序列。这些被跳过的空白字节会直接反映在tellg()返回的文件指针偏移量上,导致数值出现跳变。

以你遇到的场景为例:

  • 当读取到asdfgh的最后一个字符h后,文件指针指向后续的换行符(两个字节),下一次循环执行>> buffer时,运算符会跳过这两个字节的空白,直接定位到j的位置,因此tellg()的数值会一次性增加2,表现出从7跳至9的情况;同理,若某个位置存在连续两个空白字符,也会出现从0跳至2的跳变。

内容的提问来源于stack exchange,提问作者nyms1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 10:01:59