zoukankan      html  css  js  c++  java
  • 2020.10.31 17课 文件操作以及函数

    1 *文件操作*

    1.33

    三部分组成:文件路径,文件名主干,文件后缀****

    1.1 *fopen*

    FILE* file=fopen("文件路径",“打开方式”);****

    /文件指针 FILE*
    //打开文件 fopen("文件路径","打开方式");
    //打开方式:
    /* 文件不存在
    r 只读方式,用这个方式打开的文件就只能读,不能修改 出错
    w 只写 新建文件
    b 以二进制方式打开 出错

    +通常是和其他的打开方式组合一起使用 r+可读写
    a 追加文件内容,在文件末尾追加 新建文件

    r 以只读方式打开文件,该文件必须存在。

    r+ 以可读写方式打开文件,该文件必须存在。

    rb+ 读写打开一个二进制文件,允许读写数据,文件必须存在。

    rw+ 读写打开一个文本文件,允许读和写。

    w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。

    w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。

    a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)

    a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)

    1.2 *二进制和文本模式的区别*

    1.在windows系统中,文本模式下,文件以" "代表换行。若以文本模式打开文件,并用fputs等函数写入换行符" "时,函数会自动在" "前面加上" "。即实际写入文件的是" " 。

    2.在类Unix/Linux系统中文本模式下,文件以" "代表换行。所以Linux系统中在文本模式和二进制模式下并无区别。

    1.3 *fclose*

    fclose关闭fopen打开的文件

    fclose(file);

    1.4 *fgetc和fgets函数*

    fgetc(文件指针);会有一个返回值是int类型,读取一个字符

    FILE* file=fopen(“1.txt”,"r");
    char ch= fgetc(file);
    printf("%d",ch);
    fclose(file);
        //从已经建立好的1.txt中得到一个字符
    
    fgts
    	FILE* file=fopen(“1.txt”,"r");
       char str[100] = { "0" };
    	fgets(str, 19, file);
    	//字符串最后是
       printf("%d”,str);
           fclose(file);
    

    1.5 *EOF与feof函数文件结尾*

    feof(文件指针);判断文件指针是否指向文件末尾,到了文件末尾返回值是1
    FILE* file=fopen(“1.txt”,"r");
    char str[1024]={0};
    int i=0;
    while(!feof(file)){
        str[i++]=fgetc(file);
        
    }
        printf("%s
    ",str);
           fclose(file);
    

    UTF-8 控制台显示会乱码,改为ANSI

    简体中文GB2312

    程序怎么才能知道是否已经到达文件结尾了呢?EOF代表文件结尾

    如果已经是文件尾,feof函数返回true。

    1.6 *fputs函数*与fprintfy与fscanf函数

    fputs(char* ,文件指针);写入一个字符串

    FILE* file=fopen(“1.txt”,"w");  //得是w写入
    char str[]="哈哈哈";
        fputs(str,file);
      fclose(file);
    

    fprintf(文件指针,“格式占位符”,变量);

    就会把一些数据,int double 的变量写到文本中去

    从磁盘文件中按格式输出字符

    typedef struct node {
        int id;
        char name[20];
        int age;
        char sex[10];
    }NODE;
    
    NODE mynode[6] = {
        {1,"fei",18,"nv"},
        {2,"fei",18,"nv"},
        {3,"fei",18,"nv"},
        {4,"fei",18,"nv"},
        {5,"fei",180,"nv"},
        {6,"sunhe",18,"nan"}
    };
    
    void print() {
        FILE* file = fopen("7.txt", "w");
    
        for (int i = 0; i < 6; i++)
        {
            fprintf(file, "id:%d  姓名:%s  年龄:%d  性别:%s
    ", mynode[i].id, mynode[i].name, mynode[i].age, mynode[i].sex);
        }
        fclose(file);
    }
    

    fscanf 从磁盘文件中按格式读入字符

    void read() {
        NODE n[5] = { 0 };
        FILE* file = fopen("7.txt", "r");
        for (int i = 0; i <7; i++) {
            fscanf(file, "id:%d  姓名:%s  年龄:%d  性别:%s
    ", &mynode[i].id, mynode[i].name, &mynode[i].age,mynode[i].sex);  //int类型首地址要&,数组名就是指针
        }
    
        for (size_t i = 0; i <6; i++)
        {
            printf( "id:%d  姓名:%s  年龄:%d  性别:%s
    ", mynode[i].id, mynode[i].name, mynode[i].age, mynode[i].sex);
        }
    

    这些函数都是通过FILE *来对文件进行读写。

    都是针对文本文件的行读写函数。

    **1.7 *fseek函数*

    fseek(文件指针,int,起始点);//移动文件指针

    int:正数表示这个文件指针从起始点往后移动,负数就是往前移动

    起始点 0 文件开始的位置

    1 文件指针当前的位置

    2文件末尾的位置

     FILE* file = fopen("10.txt", "r");
        fseek(file, 3, 0);
        char str = fgetc(file);
    
        fseek(file, 1, 1);
        char str1 = fgetc(file);
        
    
        printf("%c
     %c", str, str1);
    

    int fseek(FILE * _File, long _Offset, int _Origin);

    函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere为基准,偏移offset(指针偏移量)个字节的位置,函数返回0。如果执行失败则不改变stream指向的位置,函数返回一个非0值。

    实验得出,超出文件末尾位置,还是返回0。往回偏移超出首位置,还是返回0,请小心使用。

    第一个参数stream为文件指针

    第二个参数offset为偏移量,正数表示正向偏移,负数表示负向偏移

    第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET

    SEEK_SET: 文件开头

    SEEK_CUR: 当前位置

    SEEK_END: 文件结尾

    1.8图片jpg转为pack 打包

    ftell(指针)获取文件指针的偏移量

    FILE* file1 = fopen("9.jpg", "rb");
        FILE* file2 = fopen("10.pack", "wb");
        while (!feof(file1)) {
            fputc(fgetc(file1), file2);
        }
    pack字节数比jpg多一个字节
    
    FILE* file1 = fopen("9.jpg", "rb");
        FILE* file2 = fopen("10.pack", "wb");
    fseek(file1,0,2);//从文件开头移动到文件末尾
    int x=ftell(file1)//ftell获取文件指针的偏移量 文件多少个字节大小
        printf("%d", x);
        fseek(file1, 0, 0);//再移动到文件开头
        for (int i = 0; i < x; i++)
        {
            fputc(getc(file1), file2);
        }
    
    //这样做的效果是字节数相等
    

    1.9fwrite和fread函数

    fwrite(void**buff,类型大小elementsize,个数elementcount,FILE*_stream);
    要写入文本的变量的首地址,比如要写入一个int类型变量,要写入多少个上面哪个类型大小的元素,文件指针
    FILE* file = fopen("12345.txt", "wb");
        int sum = 1235645;
    
       fwrite(&sum, sizeof(int), 1, file);
       fclose(file);
    

    建了一个文本,打开里面是二进制显示的

    fread(&sum, sizeof(int), 1, file);
    FILE* file = fopen("12345.txt", "rb");//这里改成只读二进制
        int sum = 0;//初始化为0
      fread(&sum, sizeof(int), 1, file);
    printf("%d",sum);
    fclose(file);
    

    以二进制的方式读写数据

    1.7 *stat函数*

    #include <sys/stat .h>

    int stat(const char * _Filename, struct stat * _Stat)

    stat.st_size;//文件大小,单位:字节

    函数的第一个参数代表文件名,第二个参数是struct stat结构。

    得到文件的属性,包括文件建立时间,文件大小等信息。

    1.8 *fread和fwrite函数*

    size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;

    size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);

    注意:这个函数以二进制形式对文件进行操作,不局限于文本文件

    返回值:返回实际写入的数据块数目

    1.9 *fread与feof*

    注意以下两段代码的区别

    while (!feof(p)) { fread(&buf, 1, sizeof(buf), p); }
    while (fread(&buf, 1, sizeof(buf), p))

    1.10 *通过fwrite将结构保存到二进制文件中*

    做一个代码例子

    1.12 *ftell函数*

    函数 ftell 用于得到文件位置指针当前位置相对于文件首的偏移字节数。在随机方式存取文件时,由于文件位置频繁的前后移动,程序不容易确定文件的当前位置。

    1.13 *fflush函数*

    fflush函数可以将缓冲区中任何未写入的数据写入文件中。

    成功返回0,失败返回EOF。

    int fflush(FILE * _File);

    ![img](file:///C:Users鹤儿AppDataLocalTempksohtml28796wps2.jpg)

    1.14 *remove函数*

    remove函数删除指定文件

    int remove(const char *_Filename);

    参数Filename为指定的要删除的文件名,如果是windows下文件名与路径可以用反斜杠分隔,也可以用斜杠/分隔

    1.15 *rename函数*

    rename函数将指定文件改名

    int rename(const char *_OldFilename,const char *_NewFilename);

    参数oleFilename为指定的要修改的文件名,newfilename为修改后的文件名,如果是windows下文件名与路径可以用反斜杠分隔,也可以用斜杠/分隔。

  • 相关阅读:
    用python写一个魔塔50层怪物伤害计算器
    一个奇怪的方法解决华为ENSP模拟器路由器启动后命令行一直“#”的问题
    安卓数据库sqllite查看工具Android Debug Database使用教程
    GNS3错误’Could not start Telnet console with command 'Solar-PuTTY.exe‘
    解决从其他地方拷贝过来的Android项目在本机不能运行(报错)的问题
    python不换行输出
    哈希查找对比普通遍历查找所需时间
    第二个爬虫之爬取知乎用户回答和文章并将所有内容保存到txt文件中
    我的第一个爬虫之爬取搜狗壁纸并按分类存入本地文件夹
    What is Double 11 in China? Is it a famous festival?
  • 原文地址:https://www.cnblogs.com/heerha/p/14040513.html
Copyright © 2011-2022 走看看