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

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文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

sysmain服务可以禁用吗? 电脑sysmain服务关闭后的影响与操作指南

《sysmain服务可以禁用吗?电脑sysmain服务关闭后的影响与操作指南》在Windows系统中,SysMain服务(原名Superfetch)作为一个旨在提升系统性能的关键组件,一直备受用户关... 在使用 Windows 系统时,有时候真有点像在「开盲盒」。全新安装系统后的「默认设置」,往往并不尽编

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

Python自动化处理PDF文档的操作完整指南

《Python自动化处理PDF文档的操作完整指南》在办公自动化中,PDF文档处理是一项常见需求,本文将介绍如何使用Python实现PDF文档的自动化处理,感兴趣的小伙伴可以跟随小编一起学习一下... 目录使用pymupdf读写PDF文件基本概念安装pymupdf提取文本内容提取图像添加水印使用pdfplum

Java中HashMap的用法详细介绍

《Java中HashMap的用法详细介绍》JavaHashMap是一种高效的数据结构,用于存储键值对,它是基于哈希表实现的,提供快速的插入、删除和查找操作,:本文主要介绍Java中HashMap... 目录一.HashMap1.基本概念2.底层数据结构:3.HashCode和equals方法为什么重写Has

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

使用Python的requests库来发送HTTP请求的操作指南

《使用Python的requests库来发送HTTP请求的操作指南》使用Python的requests库发送HTTP请求是非常简单和直观的,requests库提供了丰富的API,可以发送各种类型的HT... 目录前言1. 安装 requests 库2. 发送 GET 请求3. 发送 POST 请求4. 发送

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程