C语言文件的基础操作

文件

“文件”是指存放在外部存储介质(可以是磁盘、光盘、磁带等)上的数据集合。

ASCII文件和二进制文件

ASCII文件(又称文本文件)便于对字符进行逐个处理,也便于输出字符。但一般占存储空间较多,而且要花费转换时间。
二进制文件可以节省外存空间和转换时间,但一个字节并不对应一个字符,不能直接输出字符形式。
在C语言中,标准输入设备(键盘)和标准输出设备(显示器)是作为ASCII码文件处理的,它们分别称为标准输入文件和标准输出文件。

文件类型的指针

在C语言中有一个特殊的指针,这个指针是已经帮我定义好了的,在stdio的头文件中,定义了一个FILE的文件指针。
FILE指针的声明:
FILE * fp;
这是一个文件指针。变量名为 fp,类型为 FILE。文件指针指向一个结构。

标准输入/输出函数

fopen函数

fopen的函数原型:

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

功能:使用mode模式打开指定的filename文件。如果打开成功,则返回一个FILE类型的指针;打开文件失败,则返回NULL。

使用文件的方式指令的作用
“r”(只读)为输入,打开一个文本文件
“w”(只写)为输出,打开一个文本文件
“a”(追加)向文本,文件尾增加数据
“rb”(只读)为输入,打开一个二进制文件
“wb”(只写)为输出,打开一个二进制文件
“ab”(追加)向二进制文件尾增加数据
"r+“(读写)为读/写打开一个文本文件
"w+”(读写)为读/写建立一个新的文本文件
"w+”(读写)为读/写建立一个新的文本文件
“a+”(读写)为读/写打开一个文本文件(追加)
"rb+”(读写)为读/写打开一个二进制文件
“wb+”(读写)为读/写建立一个新的二进制文件
“ab+”(读写)为读/写打开一个二进制文件

含义:

  1. r(read):写
  2. w(write):读
  3. a(append):追加
  4. t(text):文本文件,可省略
  5. b(binary):二进制

fclose函数

函数调用:

fclose(文件指针);

函数功能:
使文件指针变量不指向该文件,也就是文件指针变量与文件“脱钩”,此后不能再通过该指针对原来与其相联系的文件进行读写操作
返回值:
关闭成功返回值为0;否则返回EOF(-1)

fwrite函数

函数原型:

size_t fwrite(const void *buffer,size_t bytes, sizeo_t n,FILE *fp);

函数参数:

  1. buffer:要写入数据的首地址
  2. bytes:每份数据的大小
  3. n:要写入几份数据
  4. fp:要输入的文件指针。

函数返回值:成功时返回写入的单元数,否则返回0
函数功能:fwrite是无格式写函数,用于向文件写入整块的数据。
例如我们把一个用户结构体的数据写入文件

USER user={1001, “admin”,123456}
int pf=0;
pf = fwrite(&user, sizeof(USER), 1, fp);
//fp是已经打开的文件
if(pf==0) {
	printf(“写入成功!\n”);
} else {
	printf(“写入失败!\n”);
}
//这里有一个要注意的地方就是,我们写入成功后,其实这个数据还并没有真正写入到文件
//里面,而是先存在了缓存区,所以我们要刷新一下缓存区使用fflush函数
fflush(pf);

fread函数

函数原型:

size_t fread(void *buffer, size_t bytes, sizeo_t n, FILE *fp);

函数参数:

  1. buffer:接收数据的首地址
  2. bytes:每份数据的大小
  3. n:要接收几份数据
  4. fp:要操作的文件指针。

函数名返回值:成功时返回读出的单元数,否则返回0
函数功能:fread是无格式读函数,用于向文件读出整块的数据。
例如我们把刚刚的用户读取出来

pf = fread (&user, sizeof(USER), 1, fp);
//fp是已经打开的文件
if(pf==0) {
	printf(“读取失败!\n”);
} else {
	printf(“读取成功!\n”);
}

我们使用读取函数的时候要注意光标的位置,如果光标的位置在末尾那么久读取不到东西,所以为了我们能够读取到数据我们需要一个可以定位光标的函数,下面就有介绍。

rewind函数

函数原型:

void rewind(FILE * fp) ;

函数参数:

  1. fp:要操作的文件指针

函数返回值:无
函数功能:将文件的光标定位到文件的头部
例子:

rewind(pf);

fseek函数

函数原型:

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

函数参数:

  1. fp:要操作的文件指针
  2. offset:偏移量
  3. origin:搜索起始位置

函数返回值:无
函数功能:通过指定相对于开始位置、当前位置或流的末尾位置的偏移量来定位光标位置。
这个函数的第三个参数,只有三个变量,这三个变量是库里面有对应的宏定义,SEEK_SET 或 0(文件开始),SEEK_CUR 或 1(当前文件指针位置),SEEK_END 或 2(文件末尾)。这个偏移量是可正可负的(正向后偏移,负向前偏移),一般如果在文件头那么这个偏移量为正,在尾部则为负,中间就随便了。

ftell函数

函数原型:

long int ftell(FILE *pf);

函数参数:

  1. pf:要操作的文件

函数返回值:返回字节数
函数功能:获取当前文件指针离文件开头的字节数
例子:

long int nLength=0;
fseek(fp, sizeof(USER),SEEK_END);//偏移到文件尾部
nLength = ftell(fp);//获取当前文件指针离文件开头的字节数
printf(“the file length is %d\n”, nLength);

此外还有一些有关链表与文件的操作,可以去看看菜鸡的另一篇博文:学生管理系统总结

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值