• Ukieweb

    佳的博客

    曾梦想仗剑天涯,后来工作忙没去。

C学习-函数:文件格式化 fprintf fscanf 定位 rewind fseek 判尾feof

feof(fp) 是否到文件结尾

功能:测试文件是否结束

参数:fp 为打开的文件指针

返回值:

  • 如果文件结束,值为1(真) ,windows下测值是 16可以理解为 非0 都是结束

  • 如果文件没有结束,值为0(假)

例子:

file1.txt

hi jia!

代码:

#include <stdio.h>
int main(int argc, char const *argv[])
{
    int waitag;
    int isclose, n1;
    char ch;
    FILE *f1;
    f1 = fopen("file1.txt", "r+"); //模拟打开错误:只读打开一个不存在文件
    if (f1 == NULL)
    {
        printf("我去,在下不能打开文件\n");
        // exit(0);    // 打不开文件 提示后 就退出
    }
    else
    {
        printf("成功打开了文件\n");
    }
    
    do   //主要函数
    {
        n1 = feof(f1);
        if (n1 == 0)
        {
            ch = fgetc(f1);
            printf("读到字符:%c\n", ch);
        }
        else
        {
            printf("文件结束,feof返回值为:%d\n", n1);
            break;
        }
    } while (1);
    
    isclose = fclose(f1);
    if (isclose == 0)
    {
        printf("成功关闭了文件");
    }
    else
    {
        printf("我去,在下不能正常关闭文件啊\n");
    }
    scanf("%d", &waitag);
    return 0;
}

显示

成功打开了文件
读到字符:h
读到字符:i
读到字符:
读到字符:j
读到字符:i
读到字符:a
读到字符:!
读到字符:   //会多读取一个,并且这个是读取失败的
文件结束,feof返回值为:16
成功关闭了文件

文件的定位 (移动指针)

rewind()函数

rewind(fp); 

void rewind(FILE * stream);  

功能:将指针指向文件的开始处。 

ftell()函数

ftell(fp)

long ftell(FILE *stream);

功能:返回当前文件位置,也就是说返回FILE指针当前位置

  • 用于得到文件位置指当前位置相对于文件首偏移字节数

  • 利用函数 ftell() 也能方便地知道一个文件的长。 fseek(fp, 0L,SEEK_END); len =ftell(fp)+1; 该位移值等于文件所含字节数

fseek()函数

fseek(文件指针, 位移量, 参考点);

int fseek(FILE *stream, long offset, int fromwhere);

功能:将位置指针指向所需的位置

文件指针stream:fseek函数的文件指针,应该为已经打开的文件。如果没有打开的文件,那么将会出现错误。

位移量offset:它表示位置指针相对于“起始点”移动的字节数。

  • 如果位移量是一个正数,表示从“起始点”开始往文件尾方向移动;

  • 如果位移量是一个负数,则表示从“起始点”开始往文件头方向移动。

起始点fromwhere:不能任意设定,它只能是在stdio.h中定义的三个符号常量之一:

  • 0 或 SEEK_SET 文件开始

  • 1 或 SEEK_CUR 当前位置

  • 2 或 SEEK_END 文件末尾

例子:

file1.txt

0123456789

code

#include <stdio.h>
int main(int argc, char const *argv[])
{
    int waitag;
    int isclose, n1;
    char ch;
    FILE *f1;
    f1 = fopen("file1.txt", "r+"); //模拟打开错误:只读打开一个不存在文件
    if (f1 == NULL)
    {
        printf("我去,在下不能打开文件\n");
        // exit(0);    // 打不开文件 提示后 就退出
    }
    else
    {
        printf("成功打开了文件\n");
    }
    
    ch = fgetc(f1);
    printf("读取一个字符:%c\n", ch);
    ch = fgetc(f1);
    printf("再读一下字符:%c\n", ch);
    printf("当前位置:%d\n", ftell(f1));
    
    rewind(f1);
    ch = fgetc(f1);
    printf("rewind后读一下字符:%c\n", ch);
    printf("当前位置:%d\n", ftell(f1));
    
    fseek(f1, -5, 2);
    ch = fgetc(f1);
    printf("fseek(f1,-5,2)后读一下字符:%c\n", ch);
    printf("当前位置:%d\n", ftell(f1));
    
    isclose = fclose(f1);
    if (isclose == 0)
    {
        printf("成功关闭了文件");
    }
    else
    {
        printf("我去,在下不能正常关闭文件啊\n");
    }
    scanf("%d", &waitag);
    return 0;
}

运行结果:

成功打开了文件
读取一个字符:0
再读一下字符:1
当前位置:2
rewind后读一下字符:0
当前位置:1
fseek(f1,-5,2)后读一下字符:5
当前位置:6
成功关闭了文件

文件的格式化输入输出函数

fprintf(文件指针, 格式字符串, 输出表列);

int fprintf(FILE *stream, const char *format, ...)

功能:按格式将输出表列的内容输出到指定的文件中。

与printf的区别在于:多一个参数(文件指针),向文件中写不是向屏幕输出

返回值:

  • 如果成功,返回写入的字符总数

  • 如果失败,返回一个负数。

例子:

#include <stdio.h>
int main(int argc, char const *argv[])
{
    int waitag;
    int isclose;
    FILE *f1;
    f1 = fopen("file1.txt", "w+"); //模拟打开错误:只读打开一个不存在文件
    if (f1 == NULL)
    {
        printf("我去,在下不能打开文件\n");
        // exit(0);    // 打不开文件 提示后 就退出
    }
    else
    {
        printf("成功打开了文件\n");
    }
    
    char a[] = "hello", b = 'W';
    float n1 = 123.3;
    printf("printf格式化输出:\n%s:%5c\n格式化数字:%5.3f\n", a, b, n1);
    fprintf(f1, "fprintf格式化输出:\n%s:%5c\n格式化数字:%.3f\n", a, b, n1);
    isclose = fclose(f1);
    
    if (isclose == 0)
    {
        printf("成功关闭了文件");
    }
    else
    {
        printf("我去,在下不能正常关闭文件啊\n");
    }
    scanf("%d", &waitag);
    return 0;
}

屏幕输出:

成功打开了文件
printf格式化输出:
hello:    W
格式化数字:123.300
成功关闭了文件

file1.txt

fprintf格式化输出:
hello:    W
格式化数字:123.300

fscanf(文件指针, 格式字符串, 输入表地址列);  

int fscanf(FILE *stream, const char *format, ...) 

功 能:从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。 

返回值:

  • 如果成功,该函数返回成功匹配和赋值的个数。

  • 如果失败:到达文件末尾或发生读错误,则返回 EOF

例子:

file1.txt

We are in 2017
We are in 2018

代码:

#include <stdio.h>
int main(int argc, char const *argv[])
{
    int waitag;
    int isclose;
    FILE *f1;
    f1 = fopen("file1.txt", "r+"); //模拟打开错误:只读打开一个不存在文件
    if (f1 == NULL)
    {
        printf("我去,在下不能打开文件\n");
        // exit(0);    // 打不开文件 提示后 就退出
    }
    else
    {
        printf("成功打开了文件\n");
    }
    
    char str1[10], str2[10], str3[10];
    int year;
    rewind(f1);
    fscanf(f1, "%s %s %s %d", str1, str2, str3, &year); //一次读取一行,进行格式化匹配
    printf("Read String1:%-5s\n", str1);
    printf("Read String2:%-5s\n", str2);
    printf("Read String3:%-5s\n", str3);
    printf("Read Integer:%-5d\n", year);
    
    isclose = fclose(f1);
    if (isclose == 0)
    {
        printf("成功关闭了文件");
    }
    else
    {
        printf("我去,在下不能正常关闭文件啊\n");
    }
    scanf("%d", &waitag);
    return 0;
}

显示:

成功打开了文件
Read String1:We
Read String2:are
Read String3:in
Read Integer:2017
成功关闭了文件



0
0
下一篇:C语言 gdb 调试工具 介绍 安装 使用 及常见错误

0 条评论

老佳啊

85后,大专学历,中原人士,家里没矿。

由于年轻时长的比较帅气,导致在别人眼里,我一直不谈恋爱的原因是清高,实则是自己的小自卑。最大的人生目标就是找一个相知相爱相容的人,共度余生。

和人相处时如果能感受到真诚,会非常注重彼此的关系,对别人没有什么心机,即使有利益冲突,一般也会以和为贵,因为在这个世界上,物质的东西,从来不会吸引到我。

特别迷恋那些大山大水,如果现在还能隐居,可能早就去了。对那些宏伟的有底蕴的人文景观比较不感冒。

从事于IT行业,却一直对厨房念念不忘,由于身材魁梧,总觉得自己上辈子是个将军,可惜这辈子没当兵,也不会打架。