017-文件

017-文件

一、C文件的有关概念

1.什么是文件

文件是指存储在外存储器上的数据的集合。

  • 操作系统是以文件为单位对数据进行管理的。
  • 输入输出是数据传送的过程,数据如流水一样从一处流向另一处,因此常将输入输出形象地称为流(stream),即输入输出流。
  • C语言把文件看作是一个字符(字节)的序列,即文件是由一个一个字符(字节)的数据顺序组成。
  • 一个输入输出流就是一个字节流或二进制流。
2.文件的分类

根据数据的组织形式,数据文件可分为ASCII文件和二进制文件。

ASCII文件又称为文本文件。在这种文件中,每个字节存放一个字符的ASCII码值。

二进制文件中的数据与该数据在内存中的二进制形式是一致的,其中一个字节并不代表一个字符。

例:整数10000在内存中的存储形式以及分别按ASCII码形式和二进制形式输出如下图所示:

在这里插入图片描述

3.文件缓冲区

​ ANSI C标准采用“缓冲文件系统”处理文件, 是指系统自动地为正在被使用的文件在内存中开辟一个缓冲区。当需要向外存储器中的文件输出数据时,必须先将数据送到为该文件开辟的缓冲区中,当缓冲区满以后才一起送到外存储器中。当需要从外存储器中的文件读入数据进行处理时,也首先一次从外存储器将一批数据读入缓冲区(将缓冲区充满),然后再从缓冲区中将数据逐个读出进行处理。
​ 由此可以看出,在缓冲文件系统中,对文件的输入输出是通过为该文件开辟的缓冲区进行的,对文件中数据的处理也是在该缓冲区中进行的。

4.文件指针

●在C语言的缓冲文件系统中,用文件类型指针来标识文件。

​ 缓冲文件系统为每个被使用的文件都要在内存中开辟一个存储区,存放文件的有关信息(文件名、文件状态、文件当前位置等),这些信息用一个结构体变量保存,该结构体类型名为FILE。
​ 程序是通过FILE结构体的指针来建立和文件的联系.也是利用FILE结构体指针进行文件的一切操作。

定义文件类型指针的一般形式为
FILE *指针变量名;
其中指针变量名用于指向一个文件,实际上是用于存放文件缓冲区的首地址。

5.文件的打开与关闭
FILE * fopen(const char *path, const char *mode);  

​ r 只读 为输入打开一个文件。若指定的文件不存在,则返回
​ 空指针值NULL。
​ w 只写 为输出建立一个新文件。若指定的文件已存在,则其
​ 中原有内容被删去;否则创建一个新文件。
​ a 追加写 向文件尾增加数据。若指定的文件不存在,则创建
​ 一个新文件。
​ r+ 读写 为读写打开一个文件。若指定的文件不存在,则返
​ 回空指针值NULL。
​ w+ 读写 为读写打开一个新文件。若指定的文件已存在,则
​ 其中内容被删去;否则创建一个新文件。
​ a+ 读与追加写 为读与向文件尾增加数据打开一个文件。
​ 若指定的文件不存在,则创建一个新文件。
​ 如果在后面附加“b”,则表示打开的是二进制文件,否则默认
为打开的是文本文件。

6.文件的关闭
 int fclose(FILE *fp);

功能:是将由fp指向的缓冲区中的数据存放到外存文件中,然后释放该缓冲区。 当文件被关闭后,如果想再对该文件进行操作,则必须再打开它。虽然C语言允许打开多个文件,但打开的文件个数是有限的。

​ 如果不关闭已经处理完的文件,当打开的文件个数很多时,会影响对其它文件的打开操作。因此,建议当一个文件使用完后应立即关闭它。

函数的返回值: 当顺利关闭后,返回值为0,否则返回EOF(-1).

7.向文件读写一个字符

用fputc函数向文件写入一个字符

int fputc(int c, FILE *fp);

用fgetc函数从文件读入一个字符

int fgetc(FILE *fp);

8.判文件结束函数feof()

在C语言中,只有文本文件才是以EOF作为文件结束标志的,而
二进制文件不是以EOF作为文件结束标志的。为此,C语言提供了一个
feof()函数,专门用来判断文件是否结束。

判文件结束函数的一般形式为 int feof(fp) 其中fp指向已打开的文件。

在读fp指向的文件时判断是否遇到文件结束。如果遇到文件结束,则函数feof(fp)的返回非零值;否则返回值为0。

feof()函数既可以用来判断二进制文件,也可以用来判断文本文件。

9.向文件读写一个字符串

● 读字符串函数 char *fgets(char *s, int size, FILE *fp);
其中fp为文件类型的指针,指向已打开的文件;是一个字符串指针;s用于存放从文件中读取的字符数据,size是一个整型变量,也可以是整型常量或整型表达式。

从指定的文件读入size-1个字符存放到由s指向的存储空间中,读入结束后,将自动在最后加一个字符串结束符‘\0’。如果成功返回s,否则返回 NULL

● 写字符串函数 int fputs(const char *s, FILE *fp);
其中fp为文件类型的指针,指向已打开的文件,s可以是一个字符串常量,也可以是一个指向字符串的指针,还可以是存放字符串的数组名。用于存放需要写入文件的字符数据。

将指定的字符串写到文件fp中。若写成功,则返回非负整数,否则返回EOF(-1)。

10.向文件读写一组数据

向文件读一组数据

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *fp);

其中:ptr 存放读入数据在内存的首地址。
size 每个数据项的字节数。 nmemb数据项个数。
fp 文件类型指针,指向已打开的文件

成功:返回实际读取的个数
到文件末尾返回 0

向文件写一组数据

size_t fwrite(const void *buf, size_t size, size_t count,FILE *fp);

其中:buf 输出数据的首地址。
size 每个数据项的字节数。
count 数据项个数。
fp 文件类型指针,指向已打开的文件。

成功:返回实际写入的字节数
到文件末尾返回 0

11.文件的随机读写

(1)用rewind()函数使位置指针指向文件头

void rewind(FILE *fp);   其中fp是已经打开的文件指针。

将文件的读写指针移动到文件的开头,此函数没有返回值。

(2)用fseek()函数移动位置指针

函数原型为   int fseek(FILE *fp, long offset, int whence);
调用形式为     fseek(文件指针,位移量,起始位置)

将文件的读写指针移动到指定的位置。

起始位置是指移动文件读写指针的参考位置,它有以下三个值:
SEEK_SET或0 表示文件头
SEEK_CUR或1 表示当前读写的位置
SEEK_END或2 表示文件尾
位移量是指以“起始位置”为基点,读写指针向文件尾方向移动的字
节数。这个参数的类型要求为长整型
返回值:成功返回 0 , 失败返回 -1

fseek(fp,100L,0);
将位置指针移到离文件头100个字节处
fseek(fp,50L, 1);
将位置指针移到离当前位置50个字节处
fseek(fp,-50L, 2);
将位置指针从文件末尾处向后退50个字节

(3)用ftell()函数测定位置指针的当前位置

long ftell(FILE *fp);

得到流式文件中的当前位置,用相对于文件开头的位移量来表示。

返回值:
返回当前位置,出错时返回-1L。
例:
i = ftell(fp);

将位置指针从文件末尾处向后退50个字节

(3)用ftell()函数测定位置指针的当前位置

long ftell(FILE *fp);

得到流式文件中的当前位置,用相对于文件开头的位移量来表示。

返回值:
返回当前位置,出错时返回-1L。
例:
i = ftell(fp);
if(i==-1L) printf(“error\n”);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Three笔记

有用的话赏点吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值