文件操作浅论(巨无敌详细讲解)

2024-03-12 14:10

本文主要是介绍文件操作浅论(巨无敌详细讲解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文件操作在初级C语言中是一个概念多且繁琐的章节。本篇文章采用先总后分的写法,适合于学C语言的程序猿阅读,相信这里面的内容在你看过的文件操作专题都大体出现过。觉得这篇文章总结的较为详细的话别忘了收藏与关注哦(鄙人觉得扩展的还挺全面的),我是一枚小比特,希望在接下来的沉潜岁月里陪你一起努力勇攀高峰!

目录

文件类型、文件名。文件系统

主要函数总结

 主要文件打开方式

fopen()与flcose()

fgetc()与fputc()

fgets()与fputs()

fread()与fwrite()

关于被错误使用的feof()

尾声


文件类型、文件名。文件系统

C语言文件有两种类型:二进制文件(demo.bin)和文本文件(demo.txt)。

文件名包括三部分:文件路径+文件名主干+文件后缀   e.g:D:\shilv\test.txt

C语言文件系统也有两种类型:缓冲型(利用文件指针标识文件)非缓冲型(没有文件指针,使用称为文件号的整数来标识文件)。本文章主要介绍的是缓冲型文件系统

缓冲型文件系统中,关键性概念是“文件类型指针”,简称“文件指针”。

文件指针pf(有些教材上是fp,和本文章的pf的唯一区别是字母不同而已)是指向FILE结构类型的指针变量,其定义为

FILE* pf

主要函数总结

函数函数原型大致用法
fopen()FILE *fopen( const char *filename, const char *mode )
FILE* pf = fopen("test.txt", "r");

fclose()int fclose( FILE *stream )
fclose(pf);

fgetc()

int fgetc( FILE *stream )

fgetc(pf);

fputc()int fputc( int c, FILE *stream )
fputc('b', pf);

fgets()char *fgets( char *string, int n, FILE *stream )
fgets(buf, 1024, pf);

fputs()int fputs( const char *string, FILE *stream )
fputs("hello", pf);

feof()

int feof( FILE *stream )

while(!feof(pf));

fscanf()

int fscanf( FILE *stream, const char *format [, argument ]... )

fscanf(stdin, "%d %f %s", &(s.n), &(s.score), s.arr);

fprintf()

int fprintf( FILE *stream, const char *format [, argument ]...)

fprintf(stdout, "%d %f %s", s.n, s.score, s.arr);

fread()

size_t fread( void *buffer, size_t size, size_t count, FILE *stream )

fread(&tmp, sizeof(struct S), 1, pf);

fwrite()size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream )
fwrite(stu,sizeof(STUDENT),n,fp);

strerror()char *strerror( int errnum )
printf("%s\n", strerror(errno));

perror()

void perror( const char *string )

perror("open file test2.txt");

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

int fseek( FILE *stream, long offset, int origin )

fseek(pf, 5, SEEK_SET);

ftell()

long ftell( FILE *stream )

int pos = ftell(pf);

rewind()void rewind( FILE *stream )
rewind( stream );
fflush()

int fflush( FILE *stream )   

fflush(stdin);

如上只是对函数作出整理方便读者了解个大概,具体函数功能如何下面将会一一讲解。

 主要文件打开方式

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

不用记,把"r" "w" "a"这三个理解透彻就能融会贯通啦,多说一嘴,有"b"的话就是打开二进制文件。

  

fopen()与flcose()

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

FILE *fopen( const char *filename, const char *mode )

fopen()有两个参数,第一个参数filename代表文件名,第二个形参mode表示文件打开方式。

int fclose( FILE *stream )

函数fclose()返回一个整形数值,当文件关闭成功时,返回0值,否则返回一个非0值。参考代码如下:

#include <stdio.h>
int main()
{FILE* pf = fopen("test2.txt", "r");if (pf == NULL){return 0;        //又出现了判断文件打开成功与否}fclose(pf);pf = NULL;return 0;
}

如上所示,为什么要判断文件打开成功与否呢?跟上篇动态内存分配类似,是因为文件并不是每次都能呗成功地打开的。例如,当文件不存在或者已经损坏时,文件打开就会失败。这是一个至关重要的点!

fgetc()与fputc()

int fgetc( FILE *stream )

fgetc()用于从一个只读或读写方式打开的文件上读字符,该函数较为简单,用法如下:

#include <stdio.h>
int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){return 0;}int ch = fgetc(pf);printf("%c", ch);ch = fgetc(pf);printf("%c", ch);ch = fgetc(pf);printf("%c", ch);fclose(pf);pf = NULL;return 0;
}

实现前:在文本输入x个字符

实现后:文本上的字符就会呗读取到控制台上 

 

int fputc( int c, FILE *stream

fputs()用于将一个字符写到一个文件上。用法如下:

#include <stdio.h>
int main()
{FILE* pf = fopen("test.txt", "w");if (pfWrite == NULL){return 0;}fputc('b', pf);fputc('i', pf);fputc('t', pf);fclose(pf);pf = NULL;return 0;
}

实现前:

实现后:

fgetc()和fputc()还能同时使用

#include <stdio.h>
int main()
{int ch = fgetc(stdin);fputc(ch, stdout);return 0;                   //你输入什么它就输出什么
}

fgets()与fputs()

char *fgets( char *string, int n, FILE *stream )

fgets()作用是从文件中读取字符串,它的三个参数可以这样理解:第一个参数是dest(目的地),第二个是读取字符的个数,第三个是src(源头)。大致用法如下:

#include <stdio.h>
int main()
{char arr[1024] = { 0 };FILE* pf = fopen("test.txt", "r");if (pf == NULL){return 0;}fgets(arr, 1024, pf);puts(arr);                 //相当于printf("%s", arr);fgets(arr, 1024, pf); puts(arr);fclose(pf);pf = NULL;return 0;
}

操作过程大致如fgetc(),留给读者自行操作检验。

int fputs( const char *string, FILE *stream )

fputs()函数第一个参数想是要输入的字符串,第二个参数是目标文本。大致用法如下:

#include <stdio.h>
int main()
{char buf[1024] = { 0 };FILE* pf = fopen("test.txt", "w");if (pf == NULL){return 0;}fputs("hello", pf);fputs("zjr", pf);return 0;
}

操作过程大致如fputc(),留给读者自行操作检验。

fread()与fwrite()

这两个函数是用于一次读取一组数据,即按数据块读写文件的。

size_t fread( void *buffer, size_t size, size_t count, FILE *stream )

fread()函数第一个参数是待读入数据块的起始地址,第二个参数是size是每个数据块的大小,第三个参数是最多允许读取的数据块的个数,函数返回的是实际读到的数据块个数

size_t int fwrite( const void *buffer, size_t size, size_t count, FILE *stream )

fwrite()函数第一个参数是待输出数据块的起始地址,第二个参数是size是每个数据块的大小,第三个参数是最多允许写入的数据块的个数,函数返回的是实际写入的数据块个数

fseek()与ftell()

这两个函数能实现文件的随机读写,理解难度不大。

int fseek( FILE *stream, long offset, int origin )         offset是长整型位移量

long ftell( FILE *stream )

查询MSDN可知fseek()有三种用法:

SEEK_CUR->光标定位到当前位置

SEEK_END->光标定位到字符串末尾

SEEK_SET->光标定位到字符串开头   (关于光标是什么我将在不久的将来为大家讲解)

话不多说,上代码:

#include <stdio.h>
int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){return 0;}fgetc(pf);int pos = ftell(pf);printf("%d\n", pos);fseek(pf, 5, SEEK_SET);      pos = ftell(pf);printf("%d\n", pos);fclose(pf);pf = NULL;return 0;
}

看到这的小伙伴建议自己去操作体会一下,真的一操作就清晰明了啦。

关于被错误使用的feof()

在文件读取过程中,不能用feof()函数的返回值直接用来判断文件的是否结束,而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束

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

e.g: ·fgetc()判断是否为EOF;

·fgets()判断返回值是否为NULL;

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

e.g:fread()判断返回值是否小于实际要读的个数。

尾声

感谢能阅读到者的你,以上就是我对文件操作的浅论,有些未解释到的函数由于鄙人现阶段能力不足无法作出对应讲解,未来将会发布文件操作进阶版。希望我的这篇文章能够帮助到将要学文件操作或者正在学的文件操作的你。如果你觉得这篇文章对你理解文件操作有帮助的话,请留下你的收藏与点赞哦。

 

这篇关于文件操作浅论(巨无敌详细讲解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/801514

相关文章

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

Python的pandas库基础知识超详细教程

《Python的pandas库基础知识超详细教程》Pandas是Python数据处理核心库,提供Series和DataFrame结构,支持CSV/Excel/SQL等数据源导入及清洗、合并、统计等功能... 目录一、配置环境二、序列和数据表2.1 初始化2.2  获取数值2.3 获取索引2.4 索引取内容2

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

Python屏幕抓取和录制的详细代码示例

《Python屏幕抓取和录制的详细代码示例》随着现代计算机性能的提高和网络速度的加快,越来越多的用户需要对他们的屏幕进行录制,:本文主要介绍Python屏幕抓取和录制的相关资料,需要的朋友可以参考... 目录一、常用 python 屏幕抓取库二、pyautogui 截屏示例三、mss 高性能截图四、Pill

java时区时间转为UTC的代码示例和详细解释

《java时区时间转为UTC的代码示例和详细解释》作为一名经验丰富的开发者,我经常被问到如何将Java中的时间转换为UTC时间,:本文主要介绍java时区时间转为UTC的代码示例和详细解释,文中通... 目录前言步骤一:导入必要的Java包步骤二:获取指定时区的时间步骤三:将指定时区的时间转换为UTC时间步

Java中实现对象的拷贝案例讲解

《Java中实现对象的拷贝案例讲解》Java对象拷贝分为浅拷贝(复制值及引用地址)和深拷贝(递归复制所有引用对象),常用方法包括Object.clone()、序列化及JSON转换,需处理循环引用问题,... 目录对象的拷贝简介浅拷贝和深拷贝浅拷贝深拷贝深拷贝和循环引用总结对象的拷贝简介对象的拷贝,把一个