美文网首页
C语言文件操作

C语言文件操作

作者: 晓晓桑 | 来源:发表于2020-04-26 21:01 被阅读0次

    1.打开文件 2.操作文件 3.关闭文件


    image.png image.png

    文件打开:

    #include <time.h>
    #include <errno.h>
    #include "c3.h"
    
    int main(int argc, char *argv[]) {
        //打开文件
        //文本模式:
        //第一个参数文件路径,第二次参数打开方式 r w a
        // r/rt:只读 文件必须得存在。
        // w:可读可写(擦除写)原来的内容没有了,重新写新的数据。文件不存在,会创建文件。
        // a:可读可写(接着写)如果文件有内容,会在原有的内容尾巴上接着写。文件不存在的时候会创建文件
        // r+:可读可写。 文件必须得存在。「就是比r多了个可写」
        // w+:跟w一样
        // a+:跟a一样
    
        //二进制模式
        // rb:只读 文件必须得存在。
        // wb:可读可写(擦除写)原来的内容没有了,重新写新的数据。文件不存在,会创建文件。
        // ab:可读可写(接着写)如果文件有内容,会在原有的内容尾巴上接着写。文件不存在的时候会创建文件
        // r+b/rb+:可读可写。 文件必须得存在。「就是比rb多了个可写」
        // w+b/wb+:跟wb一样
        // a+b/ab+:跟ab一样
        FILE *pFILE = fopen("../语言学习.docx", "r");
    
        if (pFILE == NULL) {
            printf("文件打开失败");
        }
        int a = errno; //官方给的文件错误码。在文件代码之后调用,出错就会返回错误码
    
        return 0;
    }
    

    fwrite写:
    fwrite(str, sizeof(char), strlen(str) + 1, pFILE);

    #include <time.h>
    #include <errno.h>
    #include "c3.h"
    int main(int argc, char *argv[]) {
        //打开文件 w a
        FILE *pFILE = fopen("../C语言学习.docx", "w");
    
        if (pFILE == NULL) {
            printf("文件打开失败");
        }
    
        //写
        char *str = "hahahahah~";
        //-----换行用字符
        //char str1='\n'
        //fwrite(&str1, sizeof(char), 1, pFILE);
        //-----换行用字符串
        //文本模式的时候换行是\n,二进制模式换行是\r\n
        //FILE *pFILE = fopen("../C语言学习.docx", "wb")的时候:
        //char *str3 = "\r\n";
        char *str3 = "\n";
        char *str2 = "heiheiheihei~";
        //strlen(str)+1 把'\0'写进去
        //如果操作失败会返回0。
        fwrite(str, sizeof(char), strlen(str) + 1, pFILE);
        fwrite(str3, sizeof(char), strlen(str3), pFILE);
        fwrite(str2, sizeof(char), strlen(str2) + 1, pFILE);
    
        //文件关闭 保存
        fclose(pFILE);
        return 0;
    

    fread读文件

    #include <time.h>
    #include <errno.h>
    #include "c3.h"
    
    int main(int argc, char *argv[]) {
    
        //打开文件 w a
        FILE *pFILE = fopen("../C语言学习.docx", "r");
    
        if (pFILE == NULL) {
            printf("文件打开失败");
        }
    
        char str[20] = {0};
        //fread读文件只能用r 或者a ,w不能用,因为w是擦除写
        //参数1:字符数组或者malloc空间
        //参数2*参数3:一次性读出的字节数
        //参数4:文件指针
        //返回值:读的字节数超过文件里面的已有字节数,返回0,
        //没有字符的时候:返回0
        //返回值返回实际读出的字节数:读的过程中没有出现错误。
    //    int a = fread(str, sizeof(char), 2, pFILE);
        int a;
        while (a = fread(str, sizeof(char), 2, pFILE)) {
            printf(str);
            //避免最后只剩下一个字符了,但是要读两个数据,其中一个是内存里面的有数据,但是文件里面没数据了
            //导致 读出来多一个字符
            str[0] = 0;
            str[1] = 0;
        }
    
        //fread读:行结尾
        //文本模式\n 二进制模式是\r\n。对应读fwrite换行。
        //考虑到移植性,用文本模式。因为linux 二进制只有\n,没有\r\n
        //
        //fread读 文件结尾: feof(pFILE); 判断文件是否到文件结尾了
        //feof(pFILE)到结尾返回1,没到结尾返回0
        //所以上面到代码,可以写成
        while (!feof(pFILE)) {
            a = fread(str, sizeof(char), 2, pFILE);
            printf(str);
            str[0] = 0;
            str[1] = 0;
        }
    
        //文件关闭 保存
        fclose(pFILE);
        return 0;
    }
    

    fread和fwrite读写结构体「只有他俩能读写结构体」

    #include <time.h>
    #include <errno.h>
    #include "c3.h"
    
    struct Node {
        int num;
        char name[10];
        double height;
        short age;
    };
    
    int main(int argc, char *argv[]) {
    
        struct Node node = {110011, "xiaoxiao", 160, 27};
    
        //打开文件 w a
        FILE *pFILE = fopen("../C语言学习.docx", "w");
        if (pFILE == NULL) {
            printf("文件打开失败");
        }
        //写
        fwrite(&node, sizeof(node), 1, pFILE);
        //写完记得保存关闭
        fclose(pFILE);
        
        //读
        struct Node node2;
        FILE *pFILE2 = fopen("../C语言学习.docx", "r");
        while (!feof(pFILE2)) {
            fread(&node2, sizeof(node2), 1, pFILE2);
        }
        //文件关闭 保存
        fclose(pFILE2);
        node2.name;
        return 0;
    }
    
    image.png

    fputs() 和 fgets()

    按行操作。
    这两个只能放字符串地址。fread和fwrite可以放任何地址。所以不能写结构体

    #include <time.h>
    #include <errno.h>
    #include "c3.h"
    
    int main(int argc, char *argv[]) {
    
        //写
        //打开文件 w a
        FILE *pFILE = fopen("../C语言学习.docx", "w");
        //成功返回0,失败返回-1
        fputs("hello fputs 111111\n", pFILE); //换行\n fputs不会主动换行
        fputs("by xiaoxiao", pFILE);
        fclose(pFILE);
    
        //读
        //打开文件 w a
        FILE *pFILE2 = fopen("../C语言学习.docx", "r");
        //定义大于一行读长度
        char str[30] = {0};
        while (!feof(pFILE2)) {
            fgets(str, 30, pFILE2);//读一行
            printf("%s", str);
        }
        fclose(pFILE2);
        return 0;
    }
    

    结果

    hello fputs 111111
    by xiaoxiao
    

    fscanf()和fprintf()

    int main(int argc, char *argv[]) {
    
        //写
        //打开文件 w a
        FILE *pFILE = fopen("../C语言学习.docx", "w");
        fprintf(pFILE, "%d %.1lf %s", 12, 33.4, "hello xiao"); //用空格
        fclose(pFILE);
    
        //读
        FILE *pFILE2 = fopen("../C语言学习.docx", "r");
        int a = 0;
        char str[20] = {0};
        double d = 1.2;
        fscanf(pFILE2, "%d %1f %s,", &a, &d, str);//格式跟写必须一样
        fclose(pFILE2);
        return 0;
    }
    

    fseek和ftell

    fseek设置文件指针对位置


    image.png
    #include <time.h>
    #include <errno.h>
    #include "c3.h"
    
    int main(int argc, char *argv[]) {
    
        //打开文件 w a
        FILE *pFILE = fopen("../C语言学习.docx", "r");
    
        char str[20] = {0};
        fread(str, 1, 4, pFILE);
        fseek(pFILE, 3L, SEEK_CUR);//SEEK_CUR SEEK_END
        fread(str, 1, 4, pFILE);
        fclose(pFILE);
        return 0;
    }
    

    ftell()返回指针当前的位置
    int a=ftell(pFILE);//当前的位置的下标

    #include <time.h>
    #include <errno.h>
    #include "c3.h"
    
    int main(int argc, char *argv[]) {
    
        FILE *pFILE = fopen("../C语言学习.docx", "r");
    
        char str[20] = {0};
        fread(str, 1, 4, pFILE);
        //fseek指向结尾,然后通过ftell就能知道文件的字符数
        fseek(pFILE, 0L, SEEK_END);
        int a=ftell(pFILE);
        fclose(pFILE);
        return 0;
    }
    

    fcose()

    关闭文件,更新到文件中,将空间释放。

    相关文章

      网友评论

          本文标题:C语言文件操作

          本文链接:https://www.haomeiwen.com/subject/dixaphtx.html