文件操作与使用

文件,是我们经常聊到的一个单词,那么什么是文件呢?从编程的角度来说,文件分为俩种,分别是程序文件和数据文件。程序文件的后缀为.c,.obj或者.exe等等,是我们经常可以通过文件助手直接看到的。而数据文件就是我们在程序运行的时候产生的数据。我们本章主要讲的是数据文件。

数据文件分为文本文件和二进制文件。以二进制的形式存储,这个数据就是二进制文件;以ascii码形式存储,他就是文本文件。在文件中,字符一律以ASCII类型存储,而数字即可以用二进制也可以使用ASCII存储。

介绍完了文件的类型,那么此时我们就要介绍数据与外界交流的方法。c语言程序针对于文件,画面,键盘灯输入输出操作都是通过流来进行操作的。我们可以简单的把流想成是一条河流,设备把数据放到流里面,然后再传输到其他设备之中。那么我们为什么在使用各种程序的时候看不到“流”的存在呢?那是因为c语言的程序默认打开了stdin——标准输入流:stdout——标准输出流和stderr——标准错误流这三个流,这三个流的类型是FILE*,通常称为文件指针,c语言里面就是通过FILE*的文件指针来维护流的操作的。

文件指针

一个文件的所有信息会被放到一个结构体之中,这个结构体会被系统命名为FILE,目前阶段我们还不太需要去考虑FILE内容的生成与创建,我们需要掌握的是文件指针的使用。通过文件指针我们可以找到文件在哪里并对其进行操作。在使用文件指针的时候也有一些库函数需要使用,如下图所列

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

ANSI C规定fopen来打开文件,使用fclose来关闭文件,fopen中的mode模型有许多中,如下图所示使用不同的mode就可以完成不同的功能。

文件的顺序读写

我们在对文件进行操作的时候,是按照从前往后的顺序的,而利用一下顺序读写函数,就可以实现文件再每一次操作以后都可以向后走一位。我们一一对以上函数进行具体的解释:

1.fgetc:

int fgetc(FILE *stream);

fgetc的功能是从文件中读取一个字符,并同时向后移动一个字符,如果没有达到达到文件末尾或者是发生错误,那就返回当前的字符,该char型字符会被强制转换为int类型后返回;如果达到文件末尾或者是发生错误的话,那就返回EOF。

2.fputc:

int fputc(int char, FILE *stream);

fputc的功能是将一个字符写入当前文件指向的位置,并使得文件指针向后移动一个单位,若写入成功,那么就返回这个字符,若写入失败,则返回EOF并在当前文件指针处设置一个错误标识符。

3.fputs:

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

fputs的功能是将一串字符串写入文件当中,起点是文件当前指向的位置,若成功写入,则返回一个不为0的整数,若写入失败,则返回EOF。注意,该库函数并不能写入空白。

4.fgets

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

fgets的功能是读取文件中的一行内容并写入str指向的空间中。如果读取到换行符或者是读取了n-1个字符了又或是达到文件末尾了,该函数就会停止工作。声明中的str是一个指向字符数组的地址,用于存储读取的字符串。n是要读取的字符的数量,一般与字符数组的大小保持一致。最后一个参数就是文件指针的地址了。如果成功读取文件中的内容并写入字符串中,该函数会返回str。如果没能成功写入,那么就会返回NULL空指针。

5.fscanf

int fscanf(FILE *stream, const char *format, ...);
scanf("%d",&a);

在了解fcanf之前,我们需要先了解一下scanf。众所周知,scanf可以取得外部设备输入的数据并按照格式放入后面对应的地址之中。而fcanf不是从你的外部设备(如键盘)中获取数据,而是从文件中获取数据,它会按照和scanf一样的规则从文件中获取等量的数据,然后放入各个参数之中。fscanf的返回值是成功操作的所有字符的个数。若失败,则返回EOF。

6.fprintf:

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

fprintf与printf的关系与上文的fscanf与scanf的关系类似,fprintf不会讲打印的数据与字符打印到你的电脑屏幕上,而是会将他们写入文件里面。。借用这个函数,我们也可以知道字符串的长度,只需要将一串字符串打印到文件里面即可。若成功,该函数返回成功写入的字符个数,若失败,则返回负数。

7.fread

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

fread函数的功能是将stream指向的文件中读取nmenb个size大小的字符并写入ptr指向的空间之中。它会返回成功读取到的字符数量,如果返回的数字和nmemb的数量不同的话,那么就是发生一定的错误或者是已经到文件的末尾。

8.fwrite

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

fwrite的功能与fread刚好相反,它从ptr中读取nmemb个大小为size的数据并写入文件之中,如果成功,就会返回写入的字符数量,若写入的字符数量不等于nmemb,那就是发生错误了。

文件的随机读写

在介绍完了文件的顺序读写以后,我们接着介绍文件的指定读写。

1.fseek

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

该函数会调整文件指针指向的位置,调整的长度为offset,从哪里开始调整呢?whence只能写入三个常量,这三个常量分别对于文件的开头,当前位置与结尾。如果调整成功,那么函数就会返回一个0,如果调整失败,该函数就返回一个非0值。

2.rewind

void rewind(FILE *stream);

rewind的功能很简单,它的功能就是让移动后的文件指针移动到文件的最初为止。

3.ftell

long int ftell(FILE* stream);

ftell该函数的功能也不算复杂,它的功能就是计算当前文件指针距离文件最开始的地方的偏移量并返回这是值。

文件读取结束的判定

文件读取结束的判定我们通常可以通过前面列到的顺序读写函数返回的值来判断,而为什么读取结束则可以通过另外两个库函数来判断。

int feof(FILE *stream);
int ferror(FILE *stream);

在前文提到过,如果文件读取结束,会根据原因留下不同的标识符,feof的功能是判断是否为文件末尾标识符,ferror的功能是判断是否为出错标识符,如果是对应的操作符,那么就会返回一个非0整数,如果不是,那么就会返回一个0.

文件缓冲区

为了提高文件的读取效率,根据ANSIC标准c语言是使用缓冲文件系统来处理数据文件的。该系统会自动的为内存中每一个正在使用的文件开辟一块文件缓冲区,从内存中要送往磁盘的数据不会直接过去,而是会先放到缓冲区里面,等到缓冲区满了或者是刷新了,那么再把缓冲区的数据送到磁盘里面。该区域的大小又编译系统或决定。

以上就是我对文件的初步学习,谢谢观阅!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值