C语言文件操作

目录

一.文件的打开和关闭

1.流和标准流

(1)流

(2)标准流

2.文件读写

(1)文件指针

(2)打开和关闭文件

(3)文件的顺序读写


 

一.文件的打开和关闭

1.流和标准流

(1)流

        C语言程序通过流进行数据的输入输出操作,除了文件操作以外,printf和scanf同样需要流进行操作,只不过打开该流的操作是默认执行的。一般情况下,想要向流里面写入数据都需要先打开流。

(2)标准流

        C语言程序在启动的时候,就已经打开了三个流,分别是stdin,stdout和stderr。

stdin是标准输入流,大多数环境通过键盘输入,比如使用scanf、getchar和gets,也可以在命令行中使用<或>来输入数据。

stdout是标准输出流,大多数环境输出至显示器界面(命令行界面),也可以在命令行中使用<或>来输出到文件中。

stderr是标准错误流,大多数环境输出到显示器界面。

这三个流的类型均为FILE*,被称为文件指针,C语言通过文件指针来维护一个流并进行各种操作。

2.文件读写

(1)文件指针

        每个被使用的文件都在内存中开辟了一个文件信息区,用于存放文件的相关信息,这些信息被存在一个结构体变量中,而该结构体类型被重命名为FILE。

一般通过一个FILE指针(FILE*)来管理维护一个文件,下面来创建一个FILE*变量:

FILE* fp = NULL;

FILE* fp;

定义pf是⼀个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是⼀个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够间接找到与它关联的文件。

(2)打开和关闭文件

头文件stdio.h中提供了一系列的文件(流)操作函数,但进行文件读写之前要先打开文件,完成之后要关闭文件,stdio.h提供了fopen函数来打开一个文件:

FILE* fopen(const char* filename,const char* mode);
int fclose(FILE* stream);

fopen中,filename为打开的文件的文件名,mode为打开文件的方式,可选项为"r","w","a"。r代表read,以只读的形式打开,如果文件不存在就会报错;w代表write,以只写的形式打开,如果文件不存在就会新建文件;a代表append,会在文件末尾追加数据,同样文件不存在会报错。

除了这基本的三种之外,还可以加上"+"或者"b",+表示同时读写,b表示以二进制形式操作。可用形式如下:

"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"

示例代码:

//fopen fclose example
#include <stdio.h>
int main ()
{
FILE * pFile = fopen ("myfile.txt","w");//打开文件
if (pFile!=NULL)
{
fputs ("fopen example",pFile);
//关闭⽂件
fclose (pFile);
}
return 0;
}

(3)文件的顺序读写

以fputc为例,函数原型如下:

int fputc ( int character, FILE * stream );

character为要输出的字符(ASCII值),stream为操作流,可输入文件指针,也可输入stdout,表示输出到标准输出流中,此时fputc与putchar作用相同。fputs,fgets,fgetc用法与fputc类似。

fscanf的原型如下:

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

stream是操作的流,可写stdout,format为格式化字符串,. . . 为对应的参数列表,除了第一个流以外与scanf用法相同,fprintf与之类似。

注意,上面函数的第一个f指的是file(文件),但该函数同样可以使用标准流进行读写。

另外,还有fread和fwrite两个函数,用于二进制输入输出,原型如下:

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

ptr指向要读/写的数据,size表示数据大小,count表示个数,stream表示要输入/输出的流。

(4)文件的随机读写

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

fseek用于调整指针位置,offset为偏移量,origin为起始位置,例子:

#include <stdio.h>
int main()
{
	FILE* pFile;
	pFile = fopen("example.txt", "w");
	fputs("This is an apple.", pFile);
	fseek(pFile, 9, SEEK_SET);
	fputs(" sam", pFile);
	fclose(pFile);
	return 0;
}

运行效果:

long int ftell ( FILE * stream );

 ftell用于返回文件指针相对于开始的偏移量

void rewind(FILE * stream);

 rewind用于让文件指针返回起始位置

(5)读取结束判定

1.fgetc返回值是否为EOF

2.fgets返回值是否为NULL

3.feof的使用

当文件读取结束时,判断是否到达了文件尾,若文件到达末尾之前读取结束(出错或被手动终止),则返回假,因此foef不能直接用来判定是否遇到文件尾。

4.fread/fwrite如果返回值大小等于size*count,则到达末尾。

  • 20
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值