C语言绝对值得一看的常识讲解:文件操作篇 篇2

本文详细介绍了C语言中文件的当前位置指针概念,以及如何跟踪、定位指针,涵盖字符读写函数(fgetc/fputc),字符串读写函数(fgets/fputs),数据块读写函数(fread/fwrite)和格式化读写函数(fscanf/fprintf),同时讨论了文件检测和随机读写方法。
摘要由CSDN通过智能技术生成

上一篇开始了文件操作的常识讲解,但是因为这部分内容多而杂,所以就分成两篇。这一篇主要和大家讲解一下文件的当前位置指针和文件的读写操作。

目录

1.文件的当前位置指针

1.1什么是文件的当前位置指针

1.2跟踪文件的当前位置指针 

1.3定位文件的当前位置指针

2.文件的读写操作

2.1字符读/写函数:fgetc/fputc

2.1.1读字符函数fgetc

2.1.2写字符函数fputc

2.2字符串读/写函数:fgets/fputs

2.2.1字符串读函数fgets

2.2.2字符串函数fputs

2.3数据块读写/函数:fread/fwrite

2.3.1数据块读函数fread

2.3.2数据块写函数fwrite

2.4格式化读/写函数:fscanf/fprintf

2.5文件检测函数

2.5.1ferror函数

2.5.2clearree函数

2.6文件的随机读写


1.文件的当前位置指针
1.1什么是文件的当前位置指针

C语言把文件看作流式文件,即文件由一个个字节组成,文件结构体类型FILE中的成员_ptr表示当前的位置指针,指向当前的读写位置,也就是将要操作的字节。一般情况下,在打开一个文件时,文件的当前位置指针位于文件首部,即指向第一字节。

随着文件读写操作的进行,文件的当前位置指针会自动向后移动。为了避免文件结束时还对文件进行读写操作,C语言提供了符号常量EOF(End of File)用来表示文件结束,其值为-1。如果文件的位置指针指向文件的末尾,则返回EOF。

1.2跟踪文件的当前位置指针 

打开文件时,编译器根据打开方式将文件的当前位置指针设置在文件头或文件尾。随着文件读写操作的进行,系统自动调整文件的当前位置指针,为了跟踪文件的读写位置,C语言提供了ftell函数和feof函数用来检测文件的当前位置指针。

ftell函数的原型如下:

long ftell (FILE*filepointer)

 其中,filepointer是文件指针,且与某个打开的文件相关联(即这里的操作对象是指向打开的文件的指针;返回值类型为long int型。

如果操作成功,返回filepointer文件的当前位置指针,即相对于文件开头的位移量(字节数)。否则,返回-1L(L表示该变量为long int类型)

假设文件指针fp已经与某个打开的文件相关联,如下语句获得文件fp的当前位置:

long int location;

location = ftell( fp );

feof函数的原型如下:

int feof(FILE*filepointer)

  其中,filepointer是文件指针,且与某个打开的文件相关联。

如果filepointer文件的当前位置指针已指向文件的末尾,则返回逻辑真;否则返回逻辑假。

1.3定位文件的当前位置指针

在C语言中,除了顺序读写方式外,还可以对文件进行随即读写,即根据需要读写特定位置的数据。C语言提供了rewind函数和fseek函数用来改变文件的当前位置指针。

rewind函数的原型如下:

void rewind(FILE*filepointer)

 其中,filepointer是文件指针,且与某个打开的文件相关联。rewind函数没有返回值。

功能是将filepointer文件的当前位置指针定位到文件的开头。

fseek函数的原型如下:

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

  其中,filepointer是文件指针,且与某个打开的文件相关联;offset为偏移量,其类型是long int类型,offset的值是正值,表示新的位置在origin的后面,offset的值为负值,表示新的位置在origin的前面;origin是起始位置,其类型是int型,origin包括头文件、文件尾和文件的当前位置。

如下图是origin的

如操作成功,则返回0,否则定位出错,返回EOF。

2.文件的读写操作

磁盘文件的读写操作是针对磁盘而言的,读文件操作(简称读操作)是将文件从磁盘文件中读取出来,写文件操作(简称写操作)是将数据写入磁盘文件。

在C语言中,对文件的读写操作通过调用库函数来完成,以下是C语言提供完成读写操作的函数:

①字符读/写函数:fgetc/fputc

②字符串读/写函数:fgets/fputs

③数据块读/写操作函数:fread/fwrite

④格式化读/写操作函数:fscanf/fprintf

使用以上函数都需要使用文件包含命令,即“#include<stdio.h>”。

2.1字符读/写函数:fgetc/fputc

字符读/写函数是以字符(占用一个字节)为读或写单位的函数,每次可从文件读取或写入单个字符。

2.1.1读字符函数fgetc

fgetc函数的功能是从指定的文件中读取单个字符。函数调用的一般形式为:

字符变量 = fgetc(文件指针);

作用是:从打开的文件中读取单个字符并赋值给字符变量。

①读取的字符如果不向字符变量赋值,读取的字符将不能保存。

②在文件内部还有位置指针,用来指向文件的当前的读写位置。文件打开时,该指针总是指向文件的第一个字节,每使用一次fgetc函数,该位置指针将向后移动一个字节。可以多次使用fgetc函数,读取多个字符。文件指针和文件内部的位置指针是不同的。

2.1.2写字符函数fputc

fputc函数的功能是把一个字符写入指定的文件中。函数调用的一般形式为:

fputc(字符量,文件指针);

其中,待写入的字符来给你可以是字符常量或变量。

fputc函数的使用说明:

①被写入的文件可以用“写”、“读写”、“添加”方式打开。用“写”或“读写”方式打开一个已存在的文件时,将清除该文件的原有内容。写入的字符,将从文件首开始,依次写入文件中。

如果需要保留文件的原有内容,则写入的字符,应该从原文件的末尾处开始存放。这时,必须用“添加”的方式打开。

②每写入一个字符,文件内部的位置指针,自动向后移一个字节。

③fputc函数有一个返回值。如果写入成功,则返回写入的字符,否则返回一个“EOF”。该返回值可用于判断写入是否成功。

2.2字符串读/写函数:fgets/fputs
2.2.1字符串读函数fgets

fgets函数的功能是从指定的文件中读取一个字符串到字符数组中。函数调用的一般形式为:

fgets(字符数组名,n,文件指针);

其中,n是一个正整数,表示从文件中读出的字符串不超过n-1个字符,在读入的最后一个字符后,加上串结束符'\0';字符数组名是建立的用于存放读出的字符串的字符数组;文件指针是指向已打开的文件的指针。

①使用fgets函数时,在读取n-1个字符之前,如果遇到换行符或“EOF”,则将终止读取过程。

②fgets函数也有返回值。当成功读取字符时,其返回值是字符数组的首地址;若读取失败,则其返回值则为“NULL”。

2.2.2字符串函数fputs

fputs函数的功能是向指定的文件写入一个字符串。函数调用的一般形式为:

fputs(字符串,文件指针);

其中,待写入的字符串可以是字符串常量,也可以是字符数组名,也可以是指针变量。

2.3数据块读写/函数:fread/fwrite

如果要读/写一组数据,例如需要读/写一个结构体变量的值,使用前边的函数就不太方便。为此,C语言提供了整体数据的读/写函数,用于读/写一组数据。

2.3.1数据块读函数fread

读数据块函数调用的一般形式为:

fread (buffer ,size ,count ,fp);

例如:

fread(fa,4,5,fp); 

表示从fp所指的文件中,每次读取4个字节(例如一个整型数)送入整型数组fa中,连续读取5次,即读取5个整型数到数组fa中。

2.3.2数据块写函数fwrite

读数据块函数调用的一般形式为:

fwrite(buffer ,size ,count ,fp);

 各参数和fread同。

注意:

①数据块读/写函数中的buffer是一个指针。在fread函数中,它是存放所读取数据块的首地址。在fwrite函数中,它是存放所写入数据块的首地址。

②size表示一个数据块的字节数。

③count表示所要读/写数据块的块数。

④fp表示文件指针

⑤fread和fwrite函数一般用于二进制文件的输出与输入。从键盘输入的数据,是ASCII码。装入内存前,回车和换行符需要转换成一个换行符,然后数据将按照在内存中的二进制形式,原样输出到指定的文件中。因此在查看文件内容时,可能与原输入数据的形式有些不同。

2.4格式化读/写函数:fscanf/fprintf

格式化读/写函数(fscanf/fprintf函数)与前面章节中函数的功能相似,都属于格式化的读/写函数。它们的主要区别在于,fscanf/fprintf函数的读/写对象不再是键盘/显示器,而是磁盘文件。

调用函数fscanf和fprintf的一般形式分别为

fscanf(文件指针,格式字符串,输入项表)

fprintf(文件指针,格式字符串,输出项表)

fscanf(fp,"%d%s",&i,a);
fprintf(fp,"%c",ch);

用fscanf和fprintf函数对磁盘进行操作,优点是容易理解、方便使用。但输入和输出时,需要进行码制转换:输入时要将ASCII码转换为二进制形式,输出时要将二进制码转换为ASCII码,花费时间较长。所以,如果内存和磁盘文件数据交换频繁时,使用fscanf和fprintf函数显得不太合适。此时,最好使用fread和fwrite函数。

2.5文件检测函数

C语言常用的文件检测函数有以下几个。

2.5.1ferror函数

调用函数ferror的一般形式为:

ferror(文件指针);

功能是:检查文件在用各种输入、输出函数进行函数读写时是否出错。如果ferror的返回值为0表示未出错,否则表示有错。

2.5.2clearree函数

调用函数clearerr的一般形式为:

clearerr(文件指针);

功能是:用于清楚出错标志和文件的结束标志,使它们为0。

2.6文件的随机读写

前面介绍的对文件的读写都是顺序方式读写。即读写文件,只能从文件的首位置开始,按顺序读写各个数据。但实际工作中,常常读写文件中的某一部分,为了解决问题,可以移动文件内部的位置指针到指定的位置再进行读写。这种方式称为随机读写。

具体使用方式:将前面介绍的读/写函数和第一大部分中的文件当前位置指针联系起来即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值