长岛冰茶不好喝 发表于 2020-11-17 01:35:05

零基础书中第八章关于read()的问题

8.14 文件的读取和定位
里面说read()是以字节为单位读取的,结果我看了下面关于定位的例子,发现read(5),但是定位到了9。
我再结合表8-2里面对read()方法的描述,是不是觉得书印错了,read()应该是以字符为单位读取的。
求助各位大神啊。

kogawananari 发表于 2020-11-17 01:45:42

可能老师说的是rb模式下吧

heidern0612 发表于 2020-11-17 08:19:00

本帖最后由 heidern0612 于 2020-11-17 08:25 编辑

read是以字节为单位读取的,但是众所周知一个汉字是按2个字符算的。

这就导致当你read一个汉字的时候,你没法read到单数字节的情况。

所以大概是为了统一这种规范,read的情况下,一个汉字也算一个字符或字节。

但tell的情况下,就能看到,一个汉字还是2个字节。

所以这里read其实应该总结为每次读取指定字节或字符比较合适。

以上纯属个人见解,胡说八道请见谅。



笨鸟学飞 发表于 2020-11-17 09:13:52

这个不难理解啊,一个是字符一个是字节。1个中文汉字、中文标点(全角标点)和全角字母数字是1个字符、2个字节
read(x)读取的是x个字符,tell()和seek()是字节
f.read(5) 结果是‘小客服:小’,你算算,小客服小,4个汉字,就是8个字符,英文的冒号,是1个字符
所以f.tell()返回9不是正常的么

hrp 发表于 2020-11-17 10:19:52

以二进制模式打开文件,则read(n)是按字节数n读取,以文本模式打开则是按字符数n读取。

长岛冰茶不好喝 发表于 2020-11-17 17:50:34

笨鸟学飞 发表于 2020-11-17 09:13
这个不难理解啊,一个是字符一个是字节。1个中文汉字、中文标点(全角标点)和全角字母数字是1个字符、2个 ...

我的问题不在tell返回9
页: [1]
查看完整版本: 零基础书中第八章关于read()的问题