• 文件操作


    首先我们使用c语言创建一个文件

    int main(void)
    {   
        FILE *fp;
        fp = fopen("test.c","w"); 
    
    
        fclose(fp);
     
        return 0;
    }

    fopen

    FILE *fopen(const char *pathname, const char *mode);
    pathname  是你要打开的文件的名字,比如上面例子中的"test.c"
    mode    是你要打开的模式,有以下几种可以选择:c语言文件打开模式

    所以我们使用w打开一个原本不存在的文件,那么就会新建一个名为test.c的文件

    fclose

    int fclose(FILE *stream);
    stream  参数就填文件描述符

    所有打开的文件在程序结束之前都必须要关闭。

    还有一个比较霸道的函数

    fcloseall

    int fcloseall(void);

    直接关闭所有打开的文件。


    那接下来我想在新建的这个文件里写点东西,可以这样

    int main(void)
    {   
        FILE *fp;
        fp = fopen("test.c","w"); 
        fprintf(fp,"%s
    ","hello everyone");
    
        fclose(fp);
     
        return 0;
    }

    在查看test.c的内容时,就能看到已经写进去了hello everyone

    当然也可以这样做

    int main(void)
    {   
        FILE *fp;
        fp = fopen("test.c","w"); 
        fputs("hello everyone 123
    ",fp);
    
        fclose(fp);
     
        return 0;
    }

    也同样可以写进去hello everyone 123

    fprintf

    int fprintf(FILE *stream, const char *format, ...);
    stream  文件描述符
          后面的参数用法和printf一样

    fputs

    int fputs(const char *s, FILE *stream);
    s    你要写入的内容(字符串)
    stream  文件描述符

    同样还有写入单个字符的函数

    fputc

    int putc(int c, FILE *stream);

    那么如果我想直接在代码中读取文件内容呢?

    int main(void)
    {   
        char tmp[100];
        FILE *fp;
        fp = fopen("test.c","rw"); 
        fputs("hello everyone 123
    ",fp);
    
        fscanf(fp,"%s",tmp);
        printf("%s
    ",tmp);
    
        fclose(fp);
     
        return 0;
    }

    也可以这样

    int main(void)
    {   
        char tmp[100];
        FILE *fp;
        fp = fopen("test.c","rw"); 
        fputs("hello everyone 123",fp);
    
        fgets(tmp,20,fp);
    //  fscanf(fp,"%s",tmp);
        printf("%s
    ",tmp);
    
        fclose(fp);
     
        return 0;
    }

    这里我打开方式变成了 rw 因为现在我要从文件中读取数据 所以只有w是读不出来的

    fscanf

    int fscanf(FILE *stream, const char *format, ...);
    stream  文件描述符
          其他参数和scanf用法相同

    和 scanf 不同的是,scanf 是从键盘输入,要想 fscanf 也从键盘输入,则第一个参数可以写 stdin

    要想用 fprintf 实现 printf 的效果,则第一个参数为 stdout

    fgets

    char *fgets(char *s, int size, FILE *stream);
    s    读出数据存放的位置
    size  读多少个数据
    stream 文件描述符

    fgetc

    int fgetc(FILE *stream);

    fgetc每读取一个字符后,将光标向后移动一位,可以继续读取下一个字符,若读取失败(最后一位) 返回值为EOF

    fread

    size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
    ptr      读取的数据存放地址
    size      每次读多少字节
    nmemb     读多少次
    stream    文件描述符

    fwrite

    size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
    ptr    要写入的数据存放的地址
    其他参数和fread相同

    使用fread读数据:

    #include <stdio.h>
    #include <string.h>
     
    int main(void)
    {   
        int a;
        char tmp[100];
        FILE *fp;
        fp = fopen("test.c","r+"); 
    
    
        fread(tmp,5,1,fp);
        puts(tmp);
    
        memset(tmp,0,100);
        a = fread(tmp,1,8,fp);
        puts(tmp);
        printf("%d
    ",a);
        
        fclose(fp);
     
        return 0;
    }

    输出结果

    hello
    everyone
    8

    第一次1次性读了5个字节,读一次,所以输出hello

    第二次分成8次,每次读1个字节,输出everyone

    返回值为实际读取的元素的个数

    #include <stdio.h>
    #include <string.h>
     
    int main(void)
    {   
        int a;
        char tmp[100];
        char *tmp2 = "hello china";
        FILE *fp;
        fp = fopen("test.c","r+"); 
    
    
        fread(tmp,5,1,fp);
        puts(tmp);
    
        memset(tmp,0,100);
        a = fread(tmp,1,8,fp);
        puts(tmp);
        printf("%d
    ",a);
    
        fwrite(tmp2,1,8,fp);
    
    
        fclose(fp);
     
        return 0;
    }

    输出结果为

    helloeveryonehello ch

    写入8次,每次1个字节,没有问题

    但是覆盖了原来的helloeveryone123

    这和我们的打开方式无关

    只要是用fwrite 如果在数据中间写,那就必然会覆盖后面的内容

  • 相关阅读:
    图表显示磁盘容量
    检测磁盘是否已经准备好
    取消磁盘共享
    远程关闭计算机
    实现注销 关机 重启计算机
    禁止用户关闭计算机
    将计算机设置为休眠状态
    java正则表达式
    JSONArray排序和倒转
    head first 设计模式笔记8-模板方法模式
  • 原文地址:https://www.cnblogs.com/qifeng1024/p/12559655.html
Copyright © 2020-2023  润新知