• 【C语言】文件操作



    前言

    本节课讲的是文件操作


    提示:以下是本篇文章正文内容,下面案例可供参考

    一、文件操作的大概过程

    文件及文件操作介绍
    什么是文件? 磁盘中的各种文件,图片文件(jpg,png,bmp,gif…),文本(doc,txt,dot,rtf,doct,wps,wpt, pdf,c,cpp,html,css,py…),其他(zip,7z,exe,msi,dll,lib,apk…)无数种文件类型,这些都是文 件,文件操作就是操作这些文件
    不同的文件区别? 不同的文件存储的数据类型不同,文件内存储数据的格式不同

    文件操作流程:
    流程:操作流程:打开文件,读写操作,关闭文件

    二、打开与关闭文件

    打开文件:FILE * = fopen(“文件路径”,打开模式):旧 与errno_t = fopen_s(FILE*,“文件路径”,“打开模式”)函数:新

    	//打开文件
    	//旧
    	FILE* pile1 = fopen("mytxt.txt", "r");
    	//参数1:文件的路径(绝对/相对)参数2:打开方式
    	//新
    	FILE* pfile2 = NULL;//新版是通过传址调用,所以需要先定义FILE类型的指针
    	errno_t e = fopen_s(&pfile2, "mytxt2.txt", "r");//参数1为传址调用,其他不变
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    FILE* 文件指针介绍:
    FILE:文件类型,,就是文件指针,打开文件的本质就是将文件内容存进文件缓冲区,FILE 可以理解为文件缓冲区首地址。随着操作,文件指针偏移,指向哪儿就从哪儿开始操作。 返回值:旧函数直接返回文件操作地址。新函数通过参数 1 的传址调用获得文件地址

    文件路径介绍:
    相对路径:默认相对于项目文件所在目录,写个名字即可
    绝对路径:完整路径名

    打开方式介绍

    文本模式: "r"/"rt" 只读,只能调用读函数,文件必须存在,否则失败。文件指针指向头字节。
    "r+" 可读可写读,读写函数都能调用,文件必须存在,否则失败。文件指针指向头字节。 
    "w"/"wt" 擦除写,只能调用写函数,文件不存在时创建文件。文件指针指向头字节。 
    "w+" 可读可写,读写函数都能调用,文件不存在时创建文件。文件指针指向头字节。 
    "a"/"at" 附加写,只能调用写函数,文件不存在时创建文件。文件指针指向尾字节。 
    "a+" 可读可写,读写函数都能调用,文件不存在时创建文件。文件指针指向尾字节。 
    
    二进制模式: "rb" 只读,只能调用读函数,文件必须存在,否则失败。文件指针指向头字节。
    "rb+" 可读可写读,读写函数都能调用,文件必须存在,否则失败。文件指针指向头字节。 
    "wb" 擦除写,只能调用写函数,文件不存在时创建文件。文件指针指向头字节。 
    "wb+" 可读可写,读写函数都能调用,文件不存在时创建文件。文件指针指向头字节。
    "ab" 附加写,只能调用写函数,文件不存在时创建文件。文件指针指向尾字节。
    "ab+" 可读可写,读写函数都能调用,文件不存在时创建文件。文件指针指向尾字节。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    二进制模式与文本模式的区别:对文件行结尾代码层面处理不同,在 windows 系统中,行结尾是\r\n,文本模式读到的是\n,二 进制模式读到的是\r\n 在 linux 系统下都是\n,没有区别。

    fopen_s返回值介绍:
    类型为erron_t

    如果他的返回值不为0,则打开文件失败

    if(e!=0&&pfile==NULL)//判断文件指针是否为NULL也是一种方法
    {
    	printf("文件打开失败\n");
    }
    
    • 1
    • 2
    • 3
    • 4

    关闭文件:fclose(FILE*)
    为什么要关闭文件?
    默认情况下不能打开两次

    fclose(pfile);
    
    • 1

    三、读写操作fputc、fgetc、feof

    fputc、fgetc

    写入一个字节:int = fputc(字符,文件指针)
    .int a = fputc('a', pfile2);//把参数1写入参数2的文件中,返回ascii整数
    读取一个字节int = fgetc(文件指针);
    .int b = fgetc(pfile2);//读取参数中一个字符,文件指向向下移动1格
    返回值为读取出的字符的ascii整数,使用"%c"打印

    注意:注意:取用r 写用a/w

    int a = fputc('a', pfile2);//把参数1写入参数2的文件中,返回ascii整数
    int b = fgetc(pfile2);//读取参数中一个字符,文件指向向下移动1格
    
    • 1
    • 2

    feof

    当读到文件结尾时,返回真
    bool = feof(文件指针);
    循环读文件

    while (1) 
    { 
    	int a = fgetc(pFile);
    	if (feof(pFile))
      		break;
     	putchar(a); 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    四、读写操作fputs、fgets

    写入n个字节:fputs(要写入的字符串,文件指针)
    读取n个字节:fgets(存储读取出来的字符串,读出的字节数,文件指针);

    //读取n个字符
    fputs("hello 文件操作", pfile2);//写入参数1到文件中
    char str[20] = { '\0' };
    fgets(str, 20, pfile2);//读取文件20个字符,存到str中
    
    • 1
    • 2
    • 3
    • 4

    五、格式化读写字符串 fprintf,fscanf,fscanf_s

    格式化写入字符串:fprintf(文件指针,“输出格式符”,数据) 把数据格式化后写入文件指针中,输出格式符要对应数据

    格式化读取字符串:fscanf(文件指针,“输入格式符”,存储变量);
    fscanf_s()---->与scanf和scanf_s的区别一样,字符串需要写字节数

    	//写
    	fprintf(pfile2, "a:%d, b:%lf,s:%s", 12, 45.6, "hello c3"); //格式化字符串写入文件
    
    	//读
    	int a = 0; 
    	double b = 0.0; 
    	char str[20] = { 0 }; 
    	fscanf_s(pfile2, "a:%d, b:%lf,s:%s", &a, &b, str, 20); //成对使用,新版 
    	fscanf(pfile2, "a:%d, b:%lf,s:%s", &a, &b, str); //老版
    	//注意:读和写的格式化字符要对应
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    注意:读和写的格式化字符要对应,很重要,要不然会读乱

    六、二进制读写数据fread、fwrite

    什么场景使用他们:都是数据的时候

    为什么要使用他们:比如 12 这个整数,前三组就是存入的字符 1 2 。而最后一组存 00001100 存入 1 字节。 所以数值类型的数据存储,可以直接使用 fread fwrite,比前三者效率高,因为前三者要 先转换,然后存

    写入:fwrite(写入数据的地址,大小,写入的次数,文件指针);
    读取:fread(存储数据的地址,大小,读取的次数,文件指针);

    	struct Node
    	{
    		int a;
    		double b;
    		char c[10];
    	};
    	//写入结构体node
    	struct Node node = { 10,20.22,"你好" };
    	fwrite(&node, sizeof(node), 1, pfile2);//写入的结构体地址、结构体大小,写入的次数,文件指针
    
    	//fread读取二进制到程序中
    	//读取结构体node
    	struct Node read_node;
    	fread(&read_node, sizeof(read_node), 1, pfile2);//取出的结构体地址、结构体大小,读出            			 	的个数的次数,文件指针
    	//打开文件看到的就是乱码了,但是在程序中看就是写入的东西了
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    七、文件操作函数

    rewind

    将文件指针指向文件首:
    rewind(文件指针)

    ftell

    返回文件指针指向的文件中的字节下标
    long = ftell(文件指针)
    返回值为long类型,他为文件指针指向的下标

    fseek

    设置文件指针指向哪个字节,成功返回 0
    fseek(文件指针,相对位置,从哪开始走)
    参数3详解:

    SEEK_SET 文件首,配合参数 2,比如 3,就是首+3 的位置,即第四个字节
    SEEK_END 文件尾,配合参数 2,比如-3,就是结尾-3 的位置,即倒数第四个字节
     SEEK_CUR 当前位置,配合参数 2,负数左移,正数右移。
    
    • 1
    • 2
    • 3

    大家可以挑选自己需要的使用


    总结

    本文讲了:打开文件、路径是什么、打开模式的挑选、读写的几种方式(fputc、fgetc、fputs、fgets、fprintf、fscanf、fscanf_s以及二进制读写fread、fwrite)、文件操作函数(rewind、ftell、fseek)

  • 相关阅读:
    从2022年Q1财报看携程的韧性和远景
    部门树递归实现
    走进音视频的世界——mp3封装格式
    天星金融普及个人养老金制度,共筑老龄友好型社会
    消息队列的模拟实现(二)
    前端sql条件拼接js工具
    皮皮仔!在 vscode 里操作数据库~
    简历(快速上手)
    Flask工厂模式蓝图使用Celery实例【亲测可用,已应用于项目中】
    [附源码]SSM计算机毕业设计视屏网站论文JAVA
  • 原文地址:https://blog.csdn.net/m0_62599305/article/details/126562190