文件
文件指存储在外部介质(如磁盘磁带)上数据的集合。操作系统(windows,Linux,Mac 均是)是以文件为单位对数据进行管理的
2. 从用户角度,文件分为特殊文件(标准输入输出文件或标准设备文件)、普通文件(磁盘文件)
3. 从操作系统角度,每一个与主机相连的输入输出设备(鼠标、键盘)都是一个文件
4. 从数据的组织形式来看,文件分为:
ASCII 文件(文本文件):每一个字节放一个 ASCII 代码
二进制文件:把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放
文件的打开与关闭
打开文件后我们得到 FILE*类型的文件指针,通过该文件指针对文件进行操作,FILE 是
一个结构体类型
struct _iobuf {
char *_ptr; //下一个要被读取的字符地址
int _cnt; // 剩余的字符,如果是输入缓冲区,那么就表示缓冲区中还有多少个字符未被读取
char *_base; // 缓冲区基地址
int _flag; // 读写状态标志位
int _file; // 文件描述符
int _charbuf;
int _bufsiz;//缓冲区大小
char *_tmpfname;
};
typedef struct _iobuf FILE;
FILE *fp;
文件的打开
#include <stdio.h>
FILE *fopen( const char *fname, const char *mode );
mode(方式) 意义
"r" 打开一个用于读取的文本文件
"w" 创建一个用于写入的文本文件
"a" 附加到一个文本文件
"rb" 打开一个用于读取的二进制文件
"wb"创建一个用于写入的二进制文件
"ab" 附加到一个二进制文件
"r+" 打开一个用于读/写的文本文件
"w+"创建一个用于读/写的文本文件
"a+" 打开一个用于读/写的文本文件
"rb+"打开一个用于读/写的二进制文件
"wb+"创建一个用于读/写的二进制文件
"ab+"打开一个用于读/写的二进制文件
文件的关闭
int fclose( FILE *stream );
函数fclose()关闭给出的文件流, 释放已关联到流的所有缓冲区。fclose()执行成功时返回 0,否则返回 EOF
文件的读写
fputc
int fputc( int ch, FILE *stream );
将字符(ch 的值)输出到 fp 所指向的文件中去,如果输出成功,则返回值就是输出的字符;如果输出失败,则返回一个 EOF
fgetc
int fgetc( FILE *stream );
从指定的文件读入一个字符,该文件必须是以读或读写方式打开的,读取成功一个字符,赋给ch。如果遇到文件结束符,返回一个文件结束标志 EOF
fread与fwrite
int fread( void *buffer, size_t size, size_t count, FILE *fp );
int fwrite( const void *buffer, size_t size, size_t count, FILE *fp );
buffer:是一个指针。
对 fread 来说,它是读入数据的存放地址。
对 fwrite 来说,是要输出数据的地址(均指起始地址)。
size: 要读写的字节数。
count: 要进行读写多少个 size 字节的数据项。
fp: 文件型指针。
fread 函数的返回值是读取的内容数量,fwrite 写成功后返回值是已写的对象的数量
fseek
int fseek( FILE *stream, long offset, int origin );
改变文件的位置指针
origin:
文件开头 SEEK_SET 0
文件当前位置 SEEK_CUR 1
文件末尾 SEEK_END 2
offset:
以起始点为基点,向前移动的字节数,一般要求为 long 型。
fseek()成功时返回 0,失败时返回非零
如果以文本方式写入的内容,一定要以文本方式来读,以二进制方式写入的内容,一定要以二进制的方式来读,不能混用
fgets
char *fgets( char *str, int num, FILE *stream );
函数 fgets()从给出的文件流中读取[num - 1]个字符并且把它们转储到 str(字符串)中. fgets()在到达行末时停止,fgets()成功时返回 str(字符串),失败时返回 NULL,读到文件结尾返回 NULL
fputs
int fputs( const char *str, FILE *stream );
fputs()函数把 str(字符串)指向的字符写到给出的输出流. 成功时返回非负值, 失败时返回 EOF
ftell
#include <stdio.h>
long ftell( FILE *stream );
ftell()函数返回 stream(流)当前的文件位置,如果发生错误返回-1
fprintf
int fprintf( FILE *stream, const char *format, ... );
fprintf()函数根据指定的 format(格式)(格式)发送信息(参数)到由 stream(流)指定的文件。fprintf()只能和 printf()一样工作(可以发现 fprintf 除去第一个形参,其他的参数与 printf 一样),printf 是将不同类型的数据以字符串的形式输出到屏幕上,fprintf是将这些数据写入到对应的文件中,fprintf()的返回值是输出的字符数,发生错误时返回一个负值
fscanf
int fscanf( FILE *stream, const char *format, ... );
scanf 是把屏幕上我们输入的字符串数据依次格式化到各个变量中,函数 fscanf()以scanf()的执行方式从给出的文件流中读取数据。fscanf()的返回值是事实上已赋值的变量的数目,与 scanf 等价,如果未进行任何分配时返回 EOF
用 fprintf 和 fscanf 函数对磁盘文件读写,使用方便,容易理解,但由于在读取时要将 ASCII 码转换为二进制形式,在写入文件时又要将二进制形式转换成字符,花费时间比较多。因此,在内存与磁盘频繁交换数据的情况下,最好不用 fprintf 和 fscanf 函数,而用fread 和 fwrite 函数
完结
C语言的回顾到这里就先告一段落,未来计划每隔一段时间就像这样总结一下,做到温故而知新