fseek
语法:
#include <stdio.h> int fseek( FILE *stream, long offset, int origin ); |
函数fseek()为给出的流设置位置数据. origin的值应该是下列值其中之一(在stdio.h中定义):
| 名称 | 说明 |
| SEEK_SET | 从文件的开始处开始搜索 |
| SEEK_CUR | 从当前位置开始搜索 |
| SEEK_END | 从文件的结束处开始搜索 |
fseek()成功时返回0,失败时返回非零. 你可以使用fseek()移动超过一个文件,但是不能在开始处之前. 使用fseek()清除关联到流的EOF标记.
code:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
FILE* file;
file = fopen("E:\\C\\vscode\\C\\file_io\\user.txt", "r");
if (!file)
{
puts("open fail");
return -1;
}
char char_ret;
//1-读取文件最后十个字符
fseek(file, -10, SEEK_END);
char_ret = fgetc(file);
while (!feof(file))
{
putchar(char_ret);
char_ret = fgetc(file);
}
putchar('\n');
char line[256];
//2-读取文件第一行
fseek(file, 0, SEEK_SET);
fgets(line, sizeof(line), file);//已经读到了第一行的结尾
printf("第一行内容是:%s", line);
//3-读取当前位置前5个字符。
fseek(file, 5, SEEK_CUR);//windows下回车符-(\r\n)占两个字符
for (int i = 0; i < 5; i++)
{
char_ret = fgetc(file);
putchar(char_ret);
}
putchar('\n');
//4-把文件的位置指针定位到开始位置
rewind(file);//等价 fseek(file,0,SEEK_SET)
for (int i = 0; i < 5; i++)
{
char_ret = fgetc(file);
putchar(char_ret);
}
fclose(file);
return 0;
}
user.txt文本
abcd efg
hijk lmndas
hello world heheA
打印结果:
orld heheA
第一行内容是:abcd efg
efg
h
over
abcd
E:\C\visualStudio\demo\fseek_io\x64\Debug\fseek_io.exe (进程 38436)已退出,代码为 0。
按任意键关闭此窗口. . .
##--//3-读取当前位置前5个字符。
预期:edg
为什么是edg,因为windows中换行符占两个位置\r和\n
结果:edg
h
?????为什么多了一个h
//3-读取当前位置前5个字符。
fseek(file, -5, SEEK_CUR);//windows下回车符-(\r\n)占两个字符
for (int i = 0; i < 5; i++)
{
char_ret = fgetc(file);
putchar(char_ret);
}
orld heheA
第一行内容是:nike adi
adi
n
nike
E:\C\visualStudio\demo\fseek_io\x64\Debug\fseek_io.exe (进程 12568)已退出,代码为 0。
说明读取windows换行符的时候,后面的确是\r\n两个字符,
但是我们使用的时候,
换行符在 打印,使用,显示的时候,为一个\n字符。
所以读五个读到了'a', 'd', 'i ' ,'\r' ,'\n'
如果只有一个\n符号的话,就会读的是'\n', 'a' ,'d', 'i' ,'\n'
显示的时候显示'a', 'd', 'i ', '\n' ,'n' 是合理的

58

被折叠的 条评论
为什么被折叠?



