文件io-fseek

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' 是合理的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值