C语言基础文件操作方式超全详解建议收藏

目录
  • 什么是文件
  • 文件名
  • 文件类型
  • 文件指针
  • 文件的打开与关闭
    • 打开方式
  • 文件的顺序读写
    • 关于fread的返回值
    • 对比一组函数
  • 文件随机读取
  • 文件结束判断
    • perror()
    • ferror()

什么是文件

磁盘上的文件是文件。

在程序设计中,我们一般读的文件有两种:程序文件 和 数据文件

程序文件包括源程序文件(后缀为.c)、目标文件(win下后缀为 .obj)、可执行文件(win下环境后缀为.exe)

数据文件:文件的内容不一定是程序,而是运行时读写的程序,比如程序运行需要从中读取数据的文件,或者输出内容的文件。

文件名

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

文件名包含3部分:文件路径+文件名主干+文件后缀

c:\code\test.txt

文件类型

文本文件:肉眼看得懂的东西

二进制文件:数据在内存中中以二进制形式存储,如果不加转换的输出到外存,就是二进制文件。

如果要求在外存上以ASCII码的形式存储,则需要在存储前转换,以ASCII字符(对应ASCII的值)的形式存储的文件就是文本文件。

文件指针

文件类型指针(文件指针)

每个被使用的文件都在内存中开辟一个相应的文件信息区,用来存放文件的相关信息(如文件名字,文件状态,文件当前的位置)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名为FILE.

vs2019编译环境中提供的 stdio.h头文件中有以下的文件类型声明。

#ifndef _FILE_DEFINED
    #define _FILE_DEFINED
    typedef struct _iobuf
    {
        void* _Placeholder;
    } FILE;
#endif

不同C编译器的FILE类型包含内容大同小异。

每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节。

一般都是通过FILE的指针来维护这个FILE结构的变量。

FILE *pf;

定义pf是一个指向FILE类型数据的指针变量,可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量可以找到与他关联的相关文件。

总结:每个被使用的文件都在内存中开辟一个相应的文件信息区,用来存放文件的相关信息,这个相关信息是个结构体,使用typedef类型重新定义,也就是FILE

文件的打开与关闭

在打开文件的同时,会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。

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

相对路径写法(当前代码所在路径下)

… 表示上一级路径

. 表示当前路径

FILE* p = fopen("../test.txt","r");    //打开当前路径低下 的test文件

绝对路径写法(明确指出)

fopen("C:\\2012_code\\84\\test\\test1.txt ","r");

打开方式

文件使用方式 含义 如果指定文件不存在
“r”(只读) 为了输入数据,打开一个已存在的文本文件 出错
“w”(只写) 为了输出数据,打开一个文本文件 建立一个新的文件(销毁原来的文件信息)
“a”(追加) 向文本文件尾添加数据 出错
“rb”(只读) 为了输入数据,打开一个二进制文件 出错
“wb”(只写) 为了输出数据,打开一个二进制文件 建立一个新的文件(销毁原来的文件信息)
“ab”(追加) 向一个二进制文件添加数据 出错
“r+”(读写) 为了读和写,打开一个文本文件 出错
“w+”(读写) 为了读和写,建立一个新的文件 建立一个新的文件
“a+”(读写) 打开一个文件,在文件尾进行读写 建立一个新的文件

如果文件打开失败,返回空指针NULL

FILE* pf = fopen("text.txt","r");
if(pf == NULL)
{
    printf("%s\n",strerror(errno));
    return 0;
}
fclose(pf);
pf = NULL;

关闭文件时是值传递,不会改变文件本身。

文件的顺序读写

结合MSDN食用更好

功能 函数名 适用于
字符输入函数 int fgetc( FILE * stream); 所有输入流
字符输出函数 int fputc(int c, FILE* stream); 所有输出流
文本行输入函数 char *fgets(char* string, int n, FILE* stream) 所有输入流
文本行输出函数 int fputs(const char* string, FILE* stream) 所有输出流
格式化输入函数 fscanf把文件假想成黑色的对话框。和普通的scanf相比,前面多了一个指向文件信息的指针。 所有输入流
格式化输出函数 fprintf 和普通的printf相比,前面多了一个指向文件信息的指针。(把数据放到文件里了) 所有输出流
二进制输入 fread : 返回类型是读了几个元素 文件
二进制输出 fwrite 文件

键盘stdin和屏幕stdout都是外部设备, stdin和stdout都是FILE类型的

键盘stdin和屏幕stdout都是外部设备, stdinstdout都是FILE类型的

键盘 - 标准输入设备; 屏幕 - 标准输出设备

是一个程序默认打开的两个流设备。

关于fread的返回值

fread returns the number of full items actually read,
which may be less than count if an error occurs or if the end of the file is encountered before reaching count.
Use the feof or ferror function to distinguish a read error from an end-of-file condition.
If size or count is 0,
fread returns 0 and the buffer contents are unchanged.

对比一组函数

scanfprintf:针对标准输入流、标准输出流的格式化输入、输出语句

fscanffprintf:针对所有输入流、所有输出流的格式化输入、输出语句

sscanfsprintf:

sscanf :从字符串中读取格式化的数据

Read formatted data from a string.

int sscanf( const char *buffer, const char *format [, argument ] ... );

sprintf:把格式化的数据存储到字符串中

Write formatted data to a string.

int sprintf( char *buffer, const char *format [, argument] ... );

用途:记录日志

但是文件不安全,不够高效 ------>>>> 数据库 MySQL ?

使用文件的格式:

打开文件 — 安全检查 ---- 操作 ---- 关闭文件

文件随机读取

fseek根据文件指针的位置和偏移量定位文件指针。

fseek
Moves the file pointer to a specified location.
int fseek( FILE *stream, long offset, int origin );
offset: 偏移量(单位字节)   origin:文件指针当前位置

文件当前位置的三种形式:

SEEK_CUR
Current position of file pointer

SEEK_END
End of file

SEEK_SET
Beginning of file

ftell返回文件指针相对于起始位置的偏移量。

ftell
Gets the current position of a file pointer.
long ftell( FILE *stream );

应用

int main()
{
    FILE* pf = fopen("test.txt","r");
    if(pf == NULL)
    {
		printf("%s\n",strerror(errno));
    }
    //1.定位文件指针
    fseek(pf, 2, SEEK_CUR);
    //2.读取文件
    int ch = fgetc(pf);

    printf("%c",ch);

    fclose(pf);
    pf=NULL;
	return 0;
}

rewind:让文件指针回到起始位置

rewind
Repositions the file pointer to the beginning of a file.
void rewind( FILE *stream );

文件结束判断

在文件读取过程中,不能用feof函数的返回值直接用来判断文件是否结束。

Return Value

The feof function returns a nonzero value after the first read operation that attempts to read past the end of the file. It returns 0 if the current position is not end of file. There is no error return.

而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。

1.文本文件读取是否结束,判断返回值是否为EOF(fgetc),或者NULL(fgets)

​ fgetc判断是否是EOFfgets判断返回值是否为NULL

2.二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。比如:通过fread判断返回值是否小于实际要读的个数。

perror()

函数直接先打印你放在括号里面的字符串,然后接着打印冒号和错误信息。

ferror()

Return Value

If no error has occurred on stream, ferror returns 0. Otherwise, it returns a nonzero value.

应用

int main()
{
	FILE* pf = fopen("test.txt","r");
    if(pf == NULL)
    {
        perror("open file test2.txt");
        return 0;
    }
    //读文件
    int ch = 0;
    while((ch = fgetc(pf)) != EOF)
    {
		putc(ch);
    }
    if(ferror(pf))
    {
		printf("error\n");
    }
    else if(feof(of))
    {
		printf("end of file");
    }
	return 0;
}

以上就是C语言文件操作方式超全详解建议收藏的详细内容,更多关于C语言文件操作方式的资料请关注我们其它相关文章!

(0)

相关推荐

  • c语言压缩文件详细讲解

    目录 c语言压缩文件 一.单文件压缩 二.多文件压缩 三.多文件异步压缩 四.压缩文件夹 c语言压缩文件 话说当今压缩市场三足鼎立,能叫上名号的有zip.rar.7z.其中zip是压缩界的鼻祖,在各大平台上的流行度最广,rar是商业软件,压缩率和效率都是很高的,对个人用户没有限制.7z是开源的,属于后起之秀,也有着不凡的压缩率,但在内存占有率的问题上,稍逊风骚.今天,主要总结下,windows平台下,zip的压缩与解压的方法,用ICSharpCode组件. 一.单文件压缩 场景,文件可能比较大,

  • C语言入门之基础知识详解

    一.思维导图 内容不限于此思维导图 二.环境搭建 对于老手,自动跳过这一趴吧,或者也可以看一下我有没有啥纰漏,毕竟小白需要这一趴. 编译器很多,大部分老师会在学生学习C语言的时候推荐使用VC,不带语言提示器的那种,说是可以提高学生的编码能力.我也不知道到底是不是这么一回事儿.我推荐使用VS,这样学的快,函数记不住的问题很严重吗?项目的车轮碾压过去,再记不住也得记住吧!!! 更何况这个系列到后面是会有需要用文本文件编程写项目的阶段. 下载VS2019社区版,不要标新立异选那些最新版的,出了问题到时

  • C语言文件操作函数大全(超详细)

    fopen(打开文件)相关函数 open,fclose表头文件 #include<stdio.h>定义函数 FILE * fopen(const char * path,const char * mode);函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态.mode有下列几种形态字符串:r 打开只读文件,该文件必须存在.r+ 打开可读写的文件,该文件必须存在.w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失.若文件不存在则建立该文件.w

  • C语言 文件操作解析详解及实例代码

    C语言文件操作解析 在文件操作中除了打开操作以及读写操作,还有几种比较常见的操作.下面介绍一下这些操作中涉及到的函数. 一.移动位置指针的函数 rewind函数和fseek函数,这两个函数的原型是: void rewind(FILE *fp);     将位置指针移动到文件首 int fseek(FILE *fp,long int offset,int origin);   将位置指针移动到距离origin的offset字节数的位置 其中对于fseek函数中的参数,origin为起始点,offs

  • C语言文件操作的入门详解教程

    一.一些需要掌握的知识点 文件有千千万万,但是在我们的程序设计当中,我们谈的文件一般有两种: 1.程序文件 包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe). 2.数据文件 文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件. 而在本节中,我们主要提到的是数据文件. 1.文件名 我们知道,名字都是用来标识和区别事物的,那么文件名也是这样,是区别各个文件的标识. 一个文件

  • C语言基础文件操作方式超全详解建议收藏

    目录 什么是文件 文件名 文件类型 文件指针 文件的打开与关闭 打开方式 文件的顺序读写 关于fread的返回值 对比一组函数 文件随机读取 文件结束判断 perror() ferror() 什么是文件 磁盘上的文件是文件. 在程序设计中,我们一般读的文件有两种:程序文件 和 数据文件 程序文件包括源程序文件(后缀为.c).目标文件(win下后缀为 .obj).可执行文件(win下环境后缀为.exe) 数据文件:文件的内容不一定是程序,而是运行时读写的程序,比如程序运行需要从中读取数据的文件,或

  • Go语言基础单元测试与性能测试示例详解

    目录 概述 单元测试 代码说明如下 问题 注意 性能测试 基本使用 自定义测试时间 概述 测试不是Go语言独有的,其实在很多语言都有测试,例如:Go.Java.Python- 要想成为一名合格的大牛,这是程序员必须具备的一项技能,特别是一些大公司,这是加分的一项,主要有如下优点: 代码可以随时测试,保证代码不会产生错误 写出更加高效的代码 testing文档 Testing_flags文档 单元测试 格式:func TestXXX(t *testing.T) //add.go package c

  • C语言基础全局变量与局部变量教程详解

    目录 一:局部变量与全局变量 1.1:局部变量 1.2:全局变量 1.3:代码解释 1.4:const修饰的变量的修改 二:静态局部变量与静态全局变量 2.1:static关键字 2.2:静态局部变量 2.3:静态全局变量 2.4:汇总 三:全局函数与静态函数 3.1:全局函数 3.2:静态函数 3.3:汇总表 一:局部变量与全局变量 1.1:局部变量 局部变量:在函数内部定义的变量 ,auto可加可不加 作用域:从定义到本函数结束 生命周期:从定义到该函数结束 1.2:全局变量 全局变量:在函

  • Go语言基础go接口用法示例详解

    目录 概述 语法 定义接口 实现接口 空接口 接口的组合 总结 概述 Go 语言中的接口就是方法签名的集合,接口只有声明,没有实现,不包含变量. 语法 定义接口 type [接口名] interface { 方法名1(参数列表) 返回值列表 方法名2(参数列表) 返回值列表 ... } 例子 type Isay interface{ sayHi() } 实现接口 例子 //定义接口的实现类 type Chinese struct{} //实现接口 func (_ *Chinese) sayHi(

  • Go语言基础map用法及示例详解

    目录 概述 语法 声明和初始化 读取 删除 遍历 总结 示例 概述 map是基于key-value键值对的无序的集合 Go语言中的map是引用类型 必须初始化才能使用. 语法 声明和初始化 配合make使用,否则是nil var map[KeyType]ValueType //KeyType:表示键的类型 //ValueType:表示键对应的值的类型 make(map[KeyType]ValueType, [cap]) //cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map

  • Go语言基础数组用法及示例详解

    目录 概述 语法 注意 示例 概述 固定长度,数组声明后长度便不能再修改 只能存储一种特定类型元素的序列 语法 编号 方式 代码示例 1 直接声明 var arr [3]int 2 make arr:=make([]int,3) 3 字面量 arr:=[3]int{1,2,3} 4 自动识别长度 arr:=[-]int{1,2,3} 5 二维数组 arr := [4][4]int{{1}, {1, 2}, {1, 2, 3}} 6 new arrp := new([10]int) 7 下标取值

  • C语言实现俄罗斯方块的六种模式详程建议收藏

    --------写在前面-------- 第一次做标题党,大家轻喷哈.这个游戏是博主在大一c语言实训时独立完成的,所有内容均为原创.小游戏耗时5天完成,除了常见的单人模式外,增加了作弊模式,双人模式,计时赛等玩法,真滴很好玩哦.虽然现在看起来很简陋,但对于当时的我来说实属不易,从页面设计到游戏背景音乐的选取再到关键算法的编写,每一步都凝汇了自己的努力,通宵鏖战的画面依然历历在目.现在分享出来,一方面是希望可以帮助到大家,另一方面也想纪念美好的大一时光.源码地址放在文末了,大家自取. ------

  • Python matplotlib 绘制散点图详解建议收藏

    目录 前言 1. 散点图概述 什么是散点图? 散点图使用场景 绘制散点图步骤 案例展示  2. 散点图属性 设置散点大小 设置散点颜色 设置散点样式 设置透明度 设置散点边框 3. 添加折线散点图 4. 多类型散点图 5. 颜色条散点图 6. 曲线散点图 总结 前言 我们在matplotlib模块学习中,发现有常用的反映数据变化的折线图,对比数据类型差异的柱状图和反应数据频率分布情况的直方图. 往期内容速看 Python用 matplotlib 绘制柱状图 Python matplotlib底层

  • Python matplotlib 绘制散点图详解建议收藏

    目录 前言 1. 散点图概述 什么是散点图? 散点图使用场景 绘制散点图步骤 案例展示  2. 散点图属性 设置散点大小 设置散点颜色 设置散点样式 设置透明度 设置散点边框 3. 添加折线散点图 4. 多类型散点图 5. 颜色条散点图 6. 曲线散点图 总结 前言 我们在matplotlib模块学习中,发现有常用的反映数据变化的折线图,对比数据类型差异的柱状图和反应数据频率分布情况的直方图. 其实在数据统计图表中,有一种图表是散列点分布在坐标中,反应数据随着自变量变化的趋势. 本期,我们将详细

  • Python正则表达式re模块详解(建议收藏!)

    目录 前言 match 匹配字符串 单字符匹配 . 匹配任意一个字符 \d 匹配数字 \D 匹配非数字 \S 匹配非空白 \w 匹配单词.字符,如大小写字母,数字,_ 下划线 \W 匹配非单词字符 [ ] 匹配[ ]中列举的字符 表示数量 * 出现0次或无数次 + 至少出现一次 ? 1次或则0次 {m,} 至少出现m次 匹配边界 $ 匹配结尾字符 ^ 匹配开头字符 \b 匹配一个单词的边界 \B 匹配非单词边界 匹配分组 | 匹配左右任意一个表达式 (ab) 将括号中字符作为一个分组 searc

随机推荐