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

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

相关文章

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

Spring boot整合dubbo+zookeeper的详细过程

《Springboot整合dubbo+zookeeper的详细过程》本文讲解SpringBoot整合Dubbo与Zookeeper实现API、Provider、Consumer模式,包含依赖配置、... 目录Spring boot整合dubbo+zookeeper1.创建父工程2.父工程引入依赖3.创建ap

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

Java操作Word文档的全面指南

《Java操作Word文档的全面指南》在Java开发中,操作Word文档是常见的业务需求,广泛应用于合同生成、报表输出、通知发布、法律文书生成、病历模板填写等场景,本文将全面介绍Java操作Word文... 目录简介段落页头与页脚页码表格图片批注文本框目录图表简介Word编程最重要的类是org.apach

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

SpringBoot整合liteflow的详细过程

《SpringBoot整合liteflow的详细过程》:本文主要介绍SpringBoot整合liteflow的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...  liteflow 是什么? 能做什么?总之一句话:能帮你规范写代码逻辑 ,编排并解耦业务逻辑,代码