百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

35岁非科班出身程序员写下C语言文件读写操作(详解),牛

wptr33 2025-02-11 13:47 30 浏览

数据流和缓冲区是什么?文件类型和文件存取方式都有啥?

数据流

就C程序而言,从程序移进,移出字节,这种字节流就叫做流。程序与数据的交互是以流的形式进行的。进行C语言文件的读写时,都会先进行“打开文件”操作,这个操作就是在打开数据流,而“关闭文件”操作就是关闭数据流。

缓冲区

在程序执行时,所提供的额外内存,可用来暂时存放准备执行的数据。它的设置是为了提高存取效率,因为内存的存取速度比磁盘驱动器快得多。

当使用标准I/O函数(包含在头文件stdio.h中)时,系统会自动设置缓冲区,并通过数据流来读写文件。当进行文件读取时,是先打开数据流,将磁盘上的文件信息拷贝到缓冲区内,然后程序再从缓冲区中读取所需数据。事实上,当写入文件时,并不会马上写入磁盘中,而是先写入缓冲区,只有在缓冲区已满或“关闭文件”时,才会将数据写入磁盘。

文件类型

文本文件和二进制文件:

文本文件是以字符编码的方式进行保存的。

二进制文件将内存中的数据原封不动的进行保存,适用于非字符为主的数据。其实,所有的数据都可以算是二进制文件。二进制文件的优点在于存取速度快,占用空间小。

文件存取方式

顺序存取方式和随机存取方式:

顺序存取就是从上往下,一笔一笔读取文件的内容。写入数据时,将数据附加在文件的末尾。这种存取方式常用于文本文件。

随机存取方式多半以二进制文件为主。它会以一个完整的单位来进行数据的读取和写入,通常以结构为单位。

什么是文件呢?

文件是一段数据的集合,这些数据可以是有规则的,也可以是无序的集合。在stdio.h有一个非常重要的东西,文件指针,每个文件都会在内存中开辟一块空间,用于存放文件的相关信息,这些信息保存在一个结构体中:

struct _iobuf {

char *_ptr; //指向buffer中第一个未读的字节

int _cnt; //记录剩余的未读字节的个数

char *_base;//文件的缓冲

int _flag;//打开文件的属性

int _file;//获取文件描述

int _charbuf;//单字节的缓冲,即缓冲大小仅为1个字节

int _bufsiz;//记录这个缓冲大小

char *_tmpfname;//临时文件名

};

typedef struct _iobuf FILE;

FILE是一个数据结构,用于访问一个流。每个流都会对应一个FILE结构体。

C语言文件操作函数详解

C语言中没有输入输出语句,所有的输入输出功能都用 ANSI C提供的一组标准库函数来实现。文件操作标准库函数有:

文件的打开

fopen():打开文件

文件的关闭

fclose():关闭文件

文件的读写

fgetc():读取一个字符

fputc():写入一个字符

fgets():读取一个字符串

fputs():写入一个字符串

fprintf():写入格式化数据

fscanf():格式化读取数据

fread():读取数据

fwrite():写入数据

文件状态检查

feof():文件是否结束

ferror():文件读/写是否出错

clearerr():清除文件错误标志

ftell():文件指针的当前位置

文件指针定位

rewind():把文件指针移到开始处

fseek():重定位文件指针

参数解释:

“r”:以只读的形式打开文本文件(不存在则出错)

“w”:以只写的形式打开文本文件(若不存在则新建,反之,则从文件起始位置写,覆盖原内容)

“a”:以追加的形式打开文本文件(若不存在,则新建;反之,在原文件后追加)

“r+”:以读写的形式打开文本文件(读时,从头开始;写时,新数据只覆盖所占的空间)

“wb”:以只写的形式打开二进制文件

“rb”:以只读的形式打开二进制文件

“ab”:以追加的形式打开一个二进制文件

“rb+”:以读写的形式打开二进制文件。

“w+”:首先建立一个新文件,进行写操作,然后从头开始读(若文件存在,原内容将全部消失)

“a+”:功能与”a”相同。只是在文件尾部追加数据后,可以从头开始读

“wb+”:功能与”w+”相同。只是在读写时,可以由位置函数设置读和写的起始位置

“ab+”:功能与”a+”相同。只是在文件尾部追加数据之后,可以由位置函数设置开始读的起始位置

打开文件

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

filename:文件的路径

mode:打开模式

例:

intmain(){ FILE* f;f = fopen("file.txt","w");if(f !=NULL) {fputs("fopen example", f); fclose(f);f=NULL; }return0;}

注意:

文件是否打开成功

关闭文件

文件指针置空

关闭文件

函数原型:int fclose( FILE *stream );

stream:流

例:

if(fclose(f)!=0){printf("File cannot be closed/n");exit(1);} else{printf("File is now closed/n");}

读取字符

int fgetc ( FILE * stream );

stream:流

例:

#includeintmain(){ FILE * pFile;intc;intn =0;pFile = fopen ("D:\\myfile.txt","r");if(pFile ==NULL) perror ("Error opening file");// 打开失败else {while(c != EOF) {c = fgetc (pFile);// 获取一个字符if(c =='$') n++;// 统计美元符号 '$' 在文件中出现的次数 }fclose (pFile);// 一定记得要关闭文件printf("The file contains %d dollar sign characters ($).\n",n); }return0;}

写入字符

int fputc( int c, FILE *stream );

c:要写入的字符

stream:流

例:

charch;FILE* pf = fopen("file.txt","w");if(pf ==NULL) {perror("error opening file");exit(0); } ch = getchar();while(ch !='$') { fputc(ch, pf); ch = getchar(); } fclose(pf);

读取字符串

char * fgets ( char * str, int num, FILE * stream );

str:将读取到的内容复制到的目标字符串

num:一次读取的大小

stream:流

例:

charbuf[10] = {0};FILE *pf = fopen("file.txt","r");if(pf ==NULL) {perror("open file for reading");exit(0); }fgets(buf,9,stdin);printf("%s", buf); fclose(pf);

写入字符串

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

string:要写入的字符串

stream:一次读取的大小

例:

charbuf[10] = {0};FILE *pf = fopen("file.txt","r");if(pf ==NULL) {perror("open file for reading");exit(0); }fgets(buf,9,stdin);fputs(buf,stdout); fclose(pf);

读取数据块

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

ptr:目标内存块

size:一次读取的字节大小

count:一次读取多少个 size

stream:流

例:

#include#include intmain(){FILE *pFile = fopen("file.txt","rb");if(pFile ==NULL) {perror ("Error opening file");return0; }charbuf[100] = {0};while(!feof(pFile))//没有到文件末尾 {memset(buf,0,sizeof(buf));size_tlen = fread(buf,sizeof(char),sizeof(buf), pFile);printf("buf: %s, len: %d\n", buf, len); } fclose(pFile);}

写入数据块

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

同理,简单好理解,就不详细阐述了。

文件指针重定位

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

stream:流

offset:相对应 origin 位置处的偏移量,单位为字节

origin:指针的位置

#define SEEK_CUR 1 // 当前位置

#define SEEK_END 2 // 末尾

#define SEEK_SET 0 // 开头

获取指针位置

long int ftell ( FILE * stream );

stream:流

获取文件大小

例:

longn;fseek(pf,0,SEEK_END);n=ftell(pf);

文件指针移到开始处

void rewind( FILE *stream );

stream:流

清除文件错误标志

void clearerr( FILE *stream );

stream:流

文件流是否读到了文件尾

int feof( FILE *stream );

stream:流

重命名文件

int rename ( const char * oldname, const char * newname );

oldname:原名

newname:新名

删除文件

int remove ( const char * filename );

filename:文件的路径

希望以上内容可以帮到你。

相关推荐

oracle数据导入导出_oracle数据导入导出工具

关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...

继续学习Python中的while true/break语句

上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个else解...

python continue和break的区别_python中break语句和continue语句的区别

python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...

简单学Python——关键字6——break和continue

Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...

2-1,0基础学Python之 break退出循环、 continue继续循环 多重循

用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...

Python 中 break 和 continue 傻傻分不清

大家好啊,我是大田。今天分享一下break和continue在代码中的执行效果是什么,进一步区分出二者的区别。一、continue例1:当小明3岁时不打印年龄,其余年龄正常循环打印。可以看...

python中的流程控制语句:continue、break 和 return使用方法

Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...

L017:continue和break - 教程文案

continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...

作为前端开发者,你都经历过怎样的面试?

已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...

面试被问 const 是否不可变?这样回答才显功底

作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...

2023金九银十必看前端面试题!2w字精品!

导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。答案:CSS的盒模型是用于布局和定位元素的概念。它由内容区域...

前端面试总结_前端面试题整理

记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...

由浅入深,66条JavaScript面试知识点(七)

作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录由浅入深,66条JavaScript面试知识点(一)由浅入深,66...

2024前端面试真题之—VUE篇_前端面试题vue2020及答案

添加图片注释,不超过140字(可选)1.vue的生命周期有哪些及每个生命周期做了什么?beforeCreate是newVue()之后触发的第一个钩子,在当前阶段data、methods、com...

今年最常见的前端面试题,你会做几道?

在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...