标准io操作

文章详细阐述了文件的分类,包括磁盘文件和设备文件,以及它们的存储方式。重点介绍了C语言中按文本和二进制形式存储文件的区别,以及文件的读写权限,如r、w、a等模式。此外,还讲解了文件的打开、读写函数,如fopen、fputc、fgetc、fgets、fputs、fread、fwrite、fprintf、fscanf和文件指针的操作,如fseek和rewind。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件的分类

在这里插入图片描述

  • 按文件的用户的角度分类:分为磁盘文件和设备文件
  • 磁盘文件按存储方式分类:
    ①按文本形式(ASCII值)存储,每个字符按一个字节存储,比如数字10000,用五个字节来存储,即‘1’ ‘0’ ‘0’ ‘0’‘0’来存储;
    以文本文件存储时,当打开文本文件时,是以单个字节来解析,所以,我们肉眼就可以看到10000.
    在这里插入图片描述
    ②按二进制形式存储,以数据在内存中的形式原样存储在磁盘,比如一个short类型的10000,二进制形式:0010 0111 0001 0000,在磁盘里按两个字节存储。
    打开文本文件时,以单个字节解析,所以看到的就是乱码,即数据的二进制形式。
    在这里插入图片描述

打开文件时的读写权限

文件的打开方式

r或rb : 以只读方式打开一个文本文件(不创建文件,若文件不存在则报错)
w或wb :以写方式打开文件(如果文件存在则清空文件,文件不存在则创建一个文件)
a或ab :以追加方式打开文件,在末尾添加内容,若文件不存在则创建文件
r+或rb+ :以可读、可写的方式打开文件(不创建新文件),如果文件存在,就覆盖文件(注意不是清空)
(以r+覆盖模式打开文件,当文件里存在abcdefg七个字符时,写入rrr三个字符时,文件里的前三个字符被覆盖,即写入rrr后,文件数据为rrrdefg);
w+或wb+ :以可读、可写的方式打开文件(如果文件存在则清空文件,文件不存在则创建一个文件)
a+或ab+ :以添加方式打开文件,打开文件并在末尾更改文件,若文件不存在则创建文件
(以a+追加模式打开文件,当文件里存在abcdfeg时,写入rrr三个字符后,文件里的数据为abcdefgrrr).

文件的读写方式

C语言用一个指针来指向一个记录文件相关信息的结构体,在打开文件后,就用这个文件指针来对文件进行读写数据。

FILE *fopen(const char *filename, const char *mode);
功能:打开文件
参数
filename:需要打开的文件名,根据需要加上路径
mode:打开文件的模式设置
返回值
成功:文件指针
失败:NULL

typedef struct 
{
	short           level;		//缓冲区"满"或者"空"的程度 
	unsigned        flags;	//文件状态标志 
	char            fd;		//文件描述符
	unsigned char   hold;	//如无缓冲区不读取字符
	short           	bsize;	//缓冲区的大小
	unsigned char   *buffer;	//数据缓冲区的位置 
	unsigned        ar;	 	//指针,当前的指向 
	unsigned        istemp;	//临时文件,指示器
	short           token;	//用于有效性的检查 
}FILE;

C语言中有三个特殊的文件指针由系统默认打开,用户无需定义即可直接使用:
stdin: 标准输入,默认为当前终端(键盘),使用的scanf、getchar函数默认从此终端获得数据。
stdout:标准输出,默认为当前终端(屏幕),使用的printf、puts函数默认输出信息到此终端。
stderr:标准出错,默认为当前终端(屏幕),使用的perror函数默认输出信息到此终端。

  1. 单个字符读取

int fputc(int c, FILE *stream);
功能:将ch转换为unsigned char后写入stream指定的文件中
参数:
c:需要写入文件的字符
stream:文件指针
返回值:
成功:返回成功写入文件的字符
失败:返回-1

int fgetc(FILE * stream);
功能:从stream指定的文件中读取一个字符
参数:
stream:文件指针
返回值:
成功:返回读取到的字符
失败:-1

  1. 行读取

char *fgets(char *s, int size, FILE *stream);
功能:将str所指定的字符串写入到stream指定的文件中,字符串结束符 ‘\0’ 不写入文件。行读写更适合用于处理文本文件。
参数:
s:字符串
size: 字符串的大小
stream:文件指针
返回值:
成功:0
失败:-1
(fgets会从键盘读取换行符;gets从键盘读取换行符后,会丢弃换行符,也可理解为不读取换行符,gets函数使用不安全,不会对输入的数据是否溢出做检查;puts函数会对输出的数据自动加上一个换行)

int fputs(const char *s, FILE *stream);
功能:将str所指定的字符串写入到stream指定的文件中,字符串结束符 ‘\0’ 不写入文件。行读写更适合用于处理文本文件。

参数:
s:字符串
stream:文件指针
返回值:
成功:0
失败:-1

  1. 数据块读取

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:以数据块的方式从文件中读取内容
参数:
ptr:存放读取出来数据的内存空间
size: size_t 为 unsigned int类型,此参数指定读取文件内容的块数据大小
nmemb:读取文件的块数,读取文件数据总大小为:size * nmemb
stream:已经打开的文件指针
返回值
成功:实际成功读取到内容的块数,如果此值比nmemb小,但大于0,说明读到文件的结尾。
失败:0

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:以数据块的方式给文件写入内容。块读写更适合用于处理二进制文件。
参数:
ptr:准备写入文件数据的地址,要写入文件的缓冲区的首地址。
size: size_t 为 unsigned int类型,此参数指定写入文件内容的块数据大小
nmemb:写入文件的块数,写入文件数据总大小为:size * nmemb
stream:已经打开的文件指针
返回值:
成功:实际成功写入文件数据的块数目,此值和 nmemb 相等
失败:0

  1. 格式化读取

int fprintf(FILE *stream, const char *format, …);
功能:遇到格式化写入文件时,应该想到这个函数。根据参数format字符串来转换并格式化数据,然后将结果输出到stream指定的文件中,指定出现字符串结束符 ‘\0’ 为止。
参数
stream:已经打开的文件
format:字符串格式,用法和printf()一样
返回值
成功:实际写入文件的字符个数
失败:-1

int fscanf(FILE *stream, const char *format, …);
功能:遇到格式化读取文件时,应该想到这个函数。
从stream指定的文件读取字符串,并根据参数format字符串来转换并格式化数据。
参数
stream:已经打开的文件
format:字符串格式,用法和scanf()一样
返回值
成功:参数数目,成功转换的值的个数
失败: - 1

移动文件指针

int fseek(FILE *stream, long offset, int whence);
第二个参数offset:偏移量
第三个参数whence:
SEEK_SET(或0),将参考点设置为文件的开头;
SEEK_CUR(或1),将参考点设置为当前的文件位置;
SEEK_END(或2),将参考点设置为文件的末尾。

void rewind(FILE *stream);
将文件指针移到文件开头。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值