C语言进阶(8)

文件分为数据文件和程序文件,下面讨论的是数据文件。

1.文件的打开和关闭

文件在打开时操作系统会形成一种结构体数据类型FILE(包含了文件大小哎,路径等等信息),我们可以使用指针指向这个来访问这个数据类型,实现间接来实现对文件的读写修改和删除。

其中FILE*就是文件类型指针,我们可以使用这个来进行访问文件,那么我们如何获取文件类型的指针使其指向文件信息结构体?我们就需要使用文件打开的库函数:fopen

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

该库函数返回的就是文件类型指针,我们就得到了指针。函数参数const char * filename是文件名是常量字符串(常量字符串就是首个的地址与char *相匹配), const char * mode是文件的打开模式(可以有读写修改等模式具体参照cplusplus网站)。其中文件的名查找的是程序所在的文件夹内,如果想要查找文件夹外就需要添加绝对路径,就是将原来文件名前面加上路径,并把单斜杠改成双斜杠。如果找不到就会返回空指针,注意检查。

下面是使用实例:

int main()
{
	FILE* fl = fopen("text.txt", "w");
	if (fl == NULL)
	{
		printf("%s", strerror(errno));
		return 1;
	}
	return 0;
}

对于关闭文件就是将原来的指针给解放,指针失效了和防止形成野指针。下面是使用实例:

int main()
{
	FILE* fl = fopen("text.txt", "w");
	if (fl == NULL)
	{
		printf("%s", strerror(errno));
		return 1;
	}
	fclose(fl);
    fl=NULL;
	return 0;
}

2.文件的操作

(1)文件的顺序读写

字符输入函数 fgetc 可以适应所有输入流,字符获取的库函数,可以将字符从文件中获取,在打开文件时要选择“r”模式。如果打开时文件不存在就创建一个新文件,如果文件里面有内容就是将其文件清空。

int fgetc ( FILE * stream );

返回的的是一个整形,就是这个字符的assic值,如果获取错误就会返回EOF;函数参数就是文件类型指针。一次只能获取一个字符。下面是使用示例:

字符输出函数 fputc 适用于所有输出流,写入是一个一个写入,打开文件时要选择“w”模式。如果打开时文件不存在就创建一个新文件,如果文件里面有内容就是将其文件清空。

int fputc ( int character, FILE * stream );

返回的是整形是写入的字符,如果写入错误就会返回EOF。函数参数int character是输入的字符,FILE * stream是文件类型指针,使用实例如下:

文本行输入函数 fgets适用于所有输入流,获取文件数据是一行一行的获取的。

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

返回值是字符串的首地址,如果获取失败就会返回空指针。函数参数char * str是存放获取的字符串,int num是获取的字符串大小,FILE * stream是文件类型指针。下面是使用实例

由于函数指针  int num是包含字符串中的\0所以使用时要关注\0的特殊情况。

文本行输出函数 fputs 适用于所有输出流,是一行一行的写入字符串。

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

返回值是非负值,如果错误就返回EOF。下面是使用实例;

格式化输入函数 fscanf 适用于所有输入流,可以以一定的格式获取数据。

int fscanf ( FILE * stream, const char * format, ... );

返回的参数个数,函数参数是FILE * stream是文件类型指针,后面的参数就是scanf的参数,下面是使用实例:

格式化输出函数 fprintf 适用于所有输出流,可以将文件以不同格式输入到文件中。

int fprintf ( FILE * stream, const char * format, ... );

返回的参数个数,函数参数是FILE * stream是文件类型指针,后面的参数就是printf的参数,下面是使用实例:

二进制输入 fread 只适用于文件,以二进制的形式获取文件数据。

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

返回的是实际上读取的字节数;函数参数 void * ptr存放获取的地址,size是每个元素的大小,size_t count是获取元素的个数。下面是使用实例:

二进制输出 fwrite 适用于文件,以二进制形式写入文件中。

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

返回的是实际上读取的字节数;函数参数 void * ptr存放获取的地址,size是每个元素的大小,size_t count是获取元素的个数。下面是使用实例:

 sscanf/sprintf

sprintf就是将格式数据去格式化后变成字符串后存入变量中;

int sprintf ( char * str, const char * format, ... );

函数参数const char * s就是所需要存入的字符串的变量,下面是使用示例:

sscanf就是通过一个字符串来获得格式化信息

int sscanf ( const char * s, const char * format, ...);

函数参数const char * s就是所需要格式化的字符串,后面存入数据中,下面是使用示例:

(2)文件的随机读写

fseek根据文件指针的位置和偏移量来定位文件指针,就是将文件指针定位到某个位置根据起点和偏移量(起点的右为正,起点左为负)。文件起点有SEEK_SET(起点),SEEK_CUR(指针目前位置),SEEK_END(文件末尾)

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

函数参数中FILE * stream是文件类型指针, long int offset是偏移量,int origin是起点

ftell 返回文件指针相对于起始位置的偏移量,就是将文件指针的偏移量返回

long int ftell ( FILE * stream );

返回值就是偏移量。

rewind 让文件指针的位置回到文件的起始位置,就是让指针恢复到原位置。

void rewind ( FILE * stream );

3.文件读取结束的判定

文件的读取结束有两种可能,一种是因为出现错误,第二种是文件读取到文件的结束

对于文件的读取判定,不同库函数判断的形式不同:

fgetc 判断结束是否为 EOF .

fgets 判断返回值是否为 NULL .

fread判断返回值是否小于实际要读的个数。

如果出现上面的情况,我们就要进行判断错误究竟是什么原因

feof是判断是不是文件的结束引起的错误,如果是返回值为真

同样地,ferror是判断是不是文件的读取错误引起的错误,如果是返回值为真。

下面是使用示例:

  • 13
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值