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

如何在C语言中获取UTF-8编码文本文件中的字符位置?

ftell() 与含宽字符文件的位置计数问题

C标准对ftell()的定义

C标准规定:当文件以二进制模式打开时,ftell()返回当前位置相对于文件开头的字节数。

...获取stream指向的流的当前文件位置指示器的值。对于二进制流,该值是从文件开头算起的字符数。对于文本流,其文件位置指示器包含未指定的信息,可用于fseek函数将流的文件位置指示器恢复到调用ftell时的位置;两个此类返回值之间的差值不一定是写入或读取字符数的有效度量。

宽字符引发的位置偏移

如果文本文件包含宽字符(例如ñ),ftell()返回的位置值会大于将文件视为线性符号序列时的列位置——因为宽字符在文件中通常占用多个字节,而ftell()是按字节计数的。

比如字符串" ñ ñññ a ñ a"直观上包含12个符号,但用以下代码遍历文件并打印ftell()结果:

void printPosition(FILE *file){
    
    int c;
    long i;
    while((c=fgetc(file)) != EOF){
        i = ftell(file);
        printf("%c %i\n", c, i);
    }
}

得到的输出为:

1
├ 2
▒ 3
  4
├ 5
▒ 6
├ 7
▒ 8
├ 9
▒ 10
  11
a 12
  13
├ 14
▒ 15
  16
a 17

测试发现,无论是以文本模式还是二进制模式打开该文件,得到的ftell()结果完全一致。


内容的提问来源于stack exchange,提问作者Daniel Muñoz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 06:22:12