提问人:Ignacio Romero 提问时间:10/21/2021 更新时间:10/24/2021 访问量:742
fseek() 在 C 语言的文本文件上
fseek() on text files in C language
问:
我开始学习 C 并且正在使用文本文件。从它们加载文本,使用它,然后在同一文件中更新它。有人告诉我,fseek() 不能保证每次都能在文本文件中工作,我真的不明白为什么。如果有人能解释这一点,那就太好了!
我还发现,如果你这样做
pos = ftell(file);
fseek(pos);
保证将指针移动到“pos”。这是对的吗?
答:
Ffseek() 用于将与给定文件关联的文件指针移动到特定位置.syntax :fseek(FILE *pointer, long int offset, int position),offset: 从位置偏移的字节数 , position: 添加偏移的位置. position 定义文件指针需要移动到的点。它有三个值: SEEK_END :表示文件的结尾。 SEEK_SET :它表示文件的开始。 SEEK_CUR :它表示文件指针的当前位置。 将指针移动到末尾 我们需要指定位置 fseek(fp, 0, SEEK_END); 指针的打印位置
printf(“%ld”, ftell(fp)); 你返回的东西也是写,但指定偏移位置要好得多
我被告知,不能保证每次都能在文本文件中工作。
fseek()
这是真的,但需要解释:
一些遗留系统使用多个字节来编码文本文件中的行尾,或者使用其他一些方案(例如固定长度的记录)进行编码......这使得文件偏移量与从流中读取的字节数不同。事实上,有些文件偏移量在文本文件中是没有意义的,比如 / 序列中字节的偏移量。此功能在写入文本文件时也是一个问题,在更新模式下,当使用相同的流指针读取和写入同一文件时更是如此。LF
CR
LF
这在Unix系统上从来都不是问题,因为文本文件和二进制文件只是由单个换行符字节表示的字节序列和行尾。
当将 C 语言移植到其他操作系统时,编译器供应商想出了各种精心设计的技巧来处理将系统特定的行尾转换为单个字节的过程。'\n'
由于这些技巧是特定于系统甚至特定于供应商的,因此在 1989 年 ANSI 起草第一个 C 标准时,没有标准方法可以标准化。他们只是同意了 mode 参数的标志,并删除了对 beyond simple constraints 返回值含义的任何约束:b
fopen()
ftell()
C19 7.21.9.2
fseek
函数概要
#include <stdio.h> int fseek(FILE *stream, long int offset, int whence);
描述
该函数为 指向的流设置文件位置指示器。如果发生读写错误,则流的错误指示器设置并失败。
fseek
stream
fseek
对于二进制流,新位置(以文件开头的字符为单位)是通过与 指定的位置相加来获得的。指定的位置是文件的开头 if ,文件位置指示符的当前值 if ,或者文件结束 if 。二进制流不需要有意义地支持值为 的调用。
offset
whence
whence
SEEK_SET
SEEK_CUR
SEEK_END
fseek
whence
SEEK_END
对于文本流,应为零,或者应为先前成功调用与同一文件关联的流上的函数返回的值,并且应为 。
offset
offset
ftell
whence
SEEK_SET
请注意,您的问题不正确,因为缺少 stream 和 whence 参数。你应该写:fseek(pos);
long pos = ftell(file);
...
fseek(file, pos, SEEK_SET); // move back to position <pos>
但请注意,这可能由于其他原因而失败:并非所有流都支持搜索,例如管道、终端连接和其他字符设备......文件偏移量可能会超出类型范围,尤其是在旧系统上,如果可用,则是首选的替代方法。fseek()
long
fgetpos()
fsetpos()
评论
't'
t
_set_fmode()
_fmode
评论
fseek()
ftell()
fseek(file, 0, SEEK_END)
ftell
"fseek()
ftell()
ftell()
fstat(fileno(fp), &sb)
sb.st_size
fseek()
ftell()