如何在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
相关产品推荐
相关产品推荐

