目录

一、为什么使用文件

二、什么是文件

2.1程序文件

2.2数据文件

2.3文件名

三、文件的打开与关闭

3.1文件指针

3.2fopen函数

3.3fclose函数

四、文件的顺序读写

4.1文件读写的思路

4.2流(stream)【理解不多】

4.3输入输出流相关函数


一、为什么使用文件

目的是:存储程序运行过程中产生的数据

使用文件我们可以将数据直接存放在电脑的硬盘上,做到数据的持久化。

数据持久化的方法:将数据存放在磁盘文件、存放到数据库中

二、什么是文件

文件:磁盘上的文件

在程序设计中,我们一般分为两种:程序文件、数据文件(按照文件功能分类)

2.1程序文件

1.源程序文件:后缀为.c

2.目标文件:windows环境下后缀为.obj【编译时临时产生的】

可执行程序:windows环境下后缀为.exe

2.2数据文件

文件的内容不一定是程序,而是程序运行时读写的数据

2.3文件名

一个文件要有一个唯一的文件标识,便于用户识别和引用

文件名包括三个部分:文件路径+文件名主干+文件后缀

为了方便起见,文件标识被称为文件名

三、文件的打开与关闭

3.1文件指针

每个被使用的文件都在内存开辟了一个相应的文件信息区,用来存放文件的相关信息(包括文件的名字、文件状态以及文件在当前的位置等)。

文件信息区其实是一个结构体变量,结构体的类型是FILE,该结构体是由系统声明的

例如:VS2022编译环境下文件类型的声明:

typedef struct _iobuf
{//结构体成员//......
}FILE;

注意:不同编译环境下结构体FILE包含的内容略有差异;

使用过程:每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充信息,一般是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来比较方便;

通过文件指针变量可以找到与他关联的文件

文件在读写之前应该先打开文件,使用结束以后应该关闭文件

ANSIC规定使用fopen函数来打开文件,fclose函数来关闭文

3.2fopen函数

功能:open a file

需要的头文件:

fopen函数:<stdio.h>

_wfopen函数:<stdio.h> or <wchar.h>

函数声明:

file* fopen(const char* fliename,const char* mode);   //mode是打开方式

可选的打开方式:

"r": 只读,前提是文件存在,文件不存在就会报错

"w":只写,打开一个空的文件,当文件有内容时,原内容被销毁

"a":增补,在文件末尾增加内容

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>int main()
{printf("\t\t\033[5;31;43mC语言学习-文件模块\033[m\n");printf("\n");printf("\n");printf("\n");//新建一个FILE类型的指针接收fopen函数的返回值FILE* pfile = fopen("test.docx", "w");  //打开失败,返回空指针,打开成功返回一个文件类型的指针if (pfile == NULL){perror("fopen:");       //perror头文件是<stdio.h>return;}fclose(pfile);pfile = NULL;return 0;
}

绝对路径:目录下的绝对位置,直接到达目标位置,一般从盘符开始

"D:\桌面\研究生\00软件学习\01C语言学习\比特课堂\14文件\fileyes\test.docx"

注意:以绝对路径的方式打开文件时,要对"\"前面添加一个"\",防止"\"将后面的内容转义

"D:\\桌面\\研究生\\00软件学习\\01C语言学习\\比特课堂\\14文件\\fileyes\t\est.docx"

适用于文件不和解决方案处于同一个文件夹的情况;

相对路径:从当前路径开始的路径,在使用过程中有很多便利

适用于文件和解决方案处于同一个文件夹的情况;

3.3fclose函数

功能:close a stream(fclose) or closea all open stream(_fcloseall)

需要的头文件:

fclose函数:<stdio.h>

_fcloseall函数:<stdio.h>

函数声明:

int fclose(FILE* stream);  //函数参数是指向待操作文件文件信息区的FILE类型的指针

返回值:

fclose:返回0,说明文件成功关闭。返回EOF,说明遇到一个错误

_fcloseall:返回n,说明n个文件被关闭。返回EOF,说明遇到错误

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>int main()
{printf("\t\t\033[5;31;43mC语言学习-文件模块\033[m\n");printf("\n");printf("\n");printf("\n");//新建一个FILE类型的指针接收fopen函数的返回值FILE* pfile = fopen("test.docx", "w");  //打开失败,返回空指针,打开成功返回一个文件类型的指针if (pfile == NULL){perror("fopen:");       //perror头文件是<stdio.h>return;}fclose(pfile);pfile = NULL;return 0;
}

关闭文件后,要将原文件指针置空;

四、文件的顺序读写

4.1文件读写的思路

在打开文件的时候,可以选择打开的方式

当选择只读时,无法修改文件内容

当选择只写时,可配合其他函数(如fputs函数)向文件内输入内容

4.2流(stream)【理解不多】

运行程序的过程中,会涉及到数据的输入和输出

输入的来源:键盘、文件、U盘、软盘......

输出的对象:控制台、文件、U盘、软盘等......

程序默认打开了三个流,分别是标准输入流stdin、标准输出流stdout、标准错误流strerr

就比如在屏幕上显示单个字符:

 fputc('w', stdout);    //stdout 是标准输出流到屏幕上

如果想使用其他流的话,必须首先声明

就比如:输出单个字符到文件中:

需要先定义一个指向文件信息区的FILE类型的指针pfile,并设置打开方式:

FILE* pfile = fopen("test.txt", "w");

然后才可以向文件中写入数据:

    fputc('w',  pfile);    //前面是字符,后面试你要输出的对象

在这两个小例子里面,stdout和pfile都是FILE类型的指针,都是流

4.3输入输出流相关函数

相关函数

功能 函数名 适用于 字符输入函数 fgetc 所有输入流 字符输处函数 fputc 所有输出流 文本行输入函数 fgets 所有输入流 文本行输出函数 fputs 所有输出流 格式化输入函数 fscanf 所有输入流 格式化输出函数 fprintf 所有输出流 二进制输入 fread 文件 二进制输出 fwrite 文件

文本输入函数:就像上个小节一样使用的那样,按照ASCII值输入输出

1.fgets函数

头文件:<stdio.h>

功能:get a string from a stream

函数声明:char* gets(cahr* string,int n,FILE* stream);  //n是最多读取的字符个数,包括\0

使用代码:

 FILE* pfile = fopen("test.txt", "r");  //打开失败,返回空指针,打开成功返回一个文件类型的指针if (pfile == NULL){perror("fopen");       //perror头文件是<stdio.h>return;}char arr[10] = { 0 };fgets(arr, 5, pfile);printf("%s\n", arr);fgets(arr, 2, pfile);printf("%s\n", arr);fclose(pfile);pfile = NULL;return 0;

需要注意的是:读取完一次,接着读取时,会接着读取后面的字符,意思是位置标识符会后移

格式化输入输出函数:

比如存储结构化的数据:

2.fprintf函数

功能:将结构化的数据(例如结构体)写入到文件(流)中

函数声明:int fprintf(FILE* stream,const char* format[,argument]...);

使用方法:与printf函数相比就是多一个文件指针的参数,其余一模一样;

代码:

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>struct S
{char arr[10];int num;float sc;
};
int main()
{FILE* pfile = fopen("test.txt", "w");if(pfile==NULL){perror("fopen");     return;}struct S s = { "haha",101,13.14f };fprintf(pfile, "arr   num   sc\n");fprintf(pfile, "%s %d %f", s.arr, s.num, s.sc);//fputs("haha", pfile);fclose(pfile);pfile = NULL;return 0;
}

3.fscanf函数

功能:将文件中结构化的数据(例如结构体)读入到程序中

函数声明:int fscanf(FILE* stream,const char* format[,argument]...);

使用方法:与scanf函数相比就是多一个文件指针的参数,其余一模一样;

代码:

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>struct S
{char arr[10];int num;float sc;
};
int main()
{FILE* pfile = fopen("test.txt", "r");if(pfile==NULL){perror("fopen");     return;}struct S s = { 0 };fprintf(pfile, "arr   num   sc\n");//fprintf(pfile, "%s %d %f", s.arr, s.num, s.sc);//fputs("haha", pfile);fscanf(pfile, "%s %d %f", s.arr, &(s.num), &(s.sc));printf("%s %d %f", s.arr, s.num, s.sc);fclose(pfile);pfile = NULL;return 0;
}

要定义一个结构体变量接收从文件中读取的信息;

二进制输入输出:

4.fwrite函数

功能:writes data to a stream

函数声明:size_t fwrite (const void* buffer,size_t size,size_t count,FILE*stream)

参数解释:

1.buffer:指向待写入的数据

2.size:数据元素的大小,单位是字节

3.count:被写入数据的个数

代码演示:

FILE* pfile = fopen("test.txt", "w");if(pfile==NULL){perror("fopen");     return;}struct S s = { "hsk",23,521.0 };fwrite(&s, sizeof(s), 1, pfile);fclose(pfile);pfile = NULL;return 0;

5.fread函数

功能:read data from a stream

函数声明:size_t fread (void* buffer,size_t size,size_t count,FILE*stream)

参数解释:

1.buffer:读入的数据写入的地址

2.size:数据元素的大小,单位是字节

3.count:读入数据的个数

代码使用:

从文件中读取二进制数据,保存到一个同类型的结构体中

FILE* pfile = fopen("test.txt", "r");if(pfile==NULL){perror("fopen");     return;}struct S s = { 0 };fread(&s, sizeof(s), 1, pfile);printf("%s %d %f", s.arr, s.num, s.sc);fclose(pfile);pfile = NULL;return 0;

6.sprintf函数

把一个格式化的数据转化为字符串

代码演示:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
struct S
{char name[10];int age;float price;
};
int main()
{struct S s = { "hit",20,55.0f };char arr[20];sprintf(arr, "%s %d %f", s.name, s.age, s.price);printf("%s", arr);return 0;
}

7.sscanf函数

从字符串读取一个结构化数据

代码演示:

struct S s = { "hit",20,55.0f };struct S m = { 0 };char arr[20];sprintf(arr, "%s %d %f", s.name, s.age, s.price);printf("%s\n", arr);sscanf(arr, "%s %d %f", m.name, &(m.age), &(m.price));printf("%s %d %f", m.name, m.age, m.price);return 0;

C语言知识点---文件相关推荐

  1. C语言知识点 -- 动态内存管理、文件操作

    C语言知识点 – 动态内存管理.文件操作 文章目录 C语言知识点 -- 动态内存管理.文件操作 一.动态内存管理 1.malloc 2.free 3.calloc 4.realloc 二.文件操作 1 ...

  2. C语言多文件编程基本格式

    1.背景: 用一个丢骰子的简单案例熟悉了C语言多文件编程该咋写 2.格式 (1)主函数文件main.c //文件头part1:所有要使用的函数#include ;#include ;#include ...

  3. STM32中C语言知识点:初学者必看,老鸟复习(长文总结)

    说在前面的话 一位初学单片机的小伙伴让我推荐C语言书籍,因为C语言基础比较差,想把C语言重新学一遍,再去学单片机,我以前刚学单片机的时候也有这样子的想法. 其实C语言是可以边学单片机边学的,学单片机的 ...

  4. python语言源程序文件类型_Python语言源程序文件的文件类型是__________。

    [单选题]Do you know Li Ming? No, I don't know _____. [填空题]从同步.异步方式的角度讲,82C55的基本输入/输出方式属于 通讯 . [判断题]扩展I/ ...

  5. c语言static知识点,C语言知识点集锦

    C语言知识点集锦 C语言作为一门非常适合编程入门的语言,打好基础的重要性不言而喻.下面整理了一些C语言知识点,希望对大家有所帮助! 知识点1:指针使用注意 Int *p只能指向int类型的数据 指针变 ...

  6. C语言复习——文件操作以及各种输入输出

    翁老师说现在很少有人直接用C语言来操作文件来储存或者读取数据了,稍微有点量的用数据库.个人觉得C语言实现文件操作还是挺有意思的.做个练习--一个简单的学生信息系统 头文件 #ifndef _STUDE ...

  7. c语言 文件存在,c语言 判断文件是否存在

    使用access函数 功能: 检查调用进程是否可以对指定的文件执行某种操作. 用法: #include #include int access(const char *pathname, int mo ...

  8. c tcp服务器发送文件,c语言tcp文件传输

    c语言tcp文件传输 内容精选 换一换 第18节Linux网络管理入门本节所讲内容:18.1OSI七层模型和TCP/IP四层模型18.1.1OSI七层模型OSI七层模型是任何与网络相关的知识都无法跳过 ...

  9. 嵌入式开发中的C语言知识点

    嵌入式开发中的C语言知识点 1.关键字 2.数据类型 3.内存管理和存储架构 4.指针和数组 5.结构类型和对齐 6.预处理机制 1.关键字 几乎每一门语言中都有关键字,具有特殊功能,C语言也不例外, ...

最新文章

  1. 百度云磁盘CDS、对象存储BOS技术深度解析
  2. KMP经典算法与变形的应用(字符串parttern匹配问题)
  3. java基础-可执行jar包
  4. linux 设置git ip,centos7安装gitlab并更改端口IP地址
  5. ubuntu16.04 编译出错:fatal error: SDL/SDL.h: No such file or directory
  6. 在不如意的世界里全力以赴_我如何在“外展之旅”中全力以赴
  7. Java 的 安全性 体现在哪里?面试题
  8. zigbee无线传感网技术与应用开发v2.0_ZigBee网络架构详解
  9. Kibana插件sentinl使用教程
  10. PyCharm安装步骤
  11. 重磅!贾扬清明日发布新一代云原生数仓与数据湖产品 | 凌云时刻
  12. 华为网络设备交换机路由器查看日志命令方法
  13. excel打不开_mac版excel死机该如何恢复?
  14. bing搜索引擎子域名收集(Python脚本)
  15. bitcscs计算机系统,深入理解计算机系统CSAPP-美-布莱恩特
  16. 关于H5版本及说明-为什么优雅草YYC蜻蜓系统H5版本打包不成功以及相关问题
  17. 大数据的兴起,数据科学家的崛起
  18. Excel统一添加前缀与后缀
  19. 对不起,精英主义与特斯拉精神背道而驰
  20. 三表左连接sql语句例子

热门文章

  1. 买进最佳时间:开盘后15分钟与闭市前15分钟
  2. 网站开发需要哪些技术_网站建设需要掌握哪些技术
  3. ActiveSync 3.7
  4. 加入编译GMS包,增加或去除谷歌相关GMS应用,移除GMS包,取消刷机后的认证弹窗通知,锁fingerprint。
  5. Android逆向反编译之工具介绍
  6. 干扰采样 破坏计算机系统信息罪,篡改污染物后台参数,构成破坏计算机信息系统罪污染环境罪吗?...
  7. 将淘宝数据包导入到自己的商城系统
  8. 【QQ聊天界面-创建自定义Cell Objective-C语言】
  9. 解决idea环境gradle构建报错:Unrecognized option: --add-opens=java.base/java.util.concurrent.atom
  10. HTML——带有超链接的网页(a 标签详解)