C与语言 文件读写

基本上每种语言都是这样,文本文件可以显示给我们看,而二进制文件是每种语言所特有的,比如python的pickle,java的objectwrite

1)文本文件
基于字符编码,常见编码有ASCII、UNICODE等
一般可以使用文本编辑器直接打开
数5678的以ASCII存储形式(ASCII码)为:
00110101 00110110 00110111 00111000

2)二进制文件
基于值编码,自己根据具体应用,指定某个值是什么意思
把内存中的数据按其在内存中的存储形式原样输出到磁盘上
数5678的存储形式(二进制码)为:00010110 00101110

typedef struct
{
	short           level;	//缓冲区"满"或者"空"的程度 
	unsigned        flags;	//文件状态标志 
	char            fd;		//文件描述符
	unsigned char   hold;	//如无缓冲区不读取字符
	short           bsize;	//缓冲区的大小
	unsigned char   *buffer;//数据缓冲区的位置 
	unsigned        ar;	 //指针,当前的指向 
	unsigned        istemp;	//临时文件,指示器
	short           token;	//用于有效性的检查 
}FILE;

声明FILE结构体类型的信息包含在头文件“stdio.h”中,一般设置一个指向FILE类型变量的指针变量,然后通过它来引用这些FILE类型变量。通过文件指针就可对它所指的文件进行各种操作。

C语言中有三个特殊的文件指针由系统默认打开,用户无需定义即可直接使用:
stdin: 标准输入,默认为当前终端(键盘),我们使用的scanf、getchar函数默认从此终端获得数据。
stdout:标准输出,默认为当前终端(屏幕),我们使用的printf、puts函数默认输出信息到此终端。
stderr:标准出错,默认为当前终端(屏幕),我们使用的perror函数默认输出信息到此终端。

C语言中,EOF表示文件结束符(end of file)。在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~127,不可能出现-1,因此可以用EOF作为文件结束标志。

当把数据以二进制形式存放到文件中时,就会有-1值的出现,因此不能采用EOF作为二进制文件的结束标志。为解决这一个问题,ANSI C提供一个feof函数,用来判断文件是否结束。feof函数既可用以判断二进制文件又可用以判断文本文件。

函数 描述
FILE * fopen(const char * filename, const char * mode); 打开文件
int fclose(FILE * stream); 关闭先前fopen()打开的文件。此动作让缓冲区的数据写入文件中,并释放系统所提供的文件资源。
int fputc(int ch, FILE * stream); 将ch转换为unsigned char后写入stream指定的文件中
int fgetc(FILE * stream); 从stream指定的文件中读取一个字符
int fputs(const char * str, FILE * stream); 将str所指定的字符串写入到stream指定的文件中,字符串结束符 ‘\0’ 不写入文件。
char * fgets(char * str, int size, FILE * stream); 从stream指定的文件内读入字符,保存到str所指定的内存空间,直到出现换行字符、读到文件结尾或是已读了size - 1个字符为止,最后会自动加上字符 ‘\0’ 作为字符串结束。
int fprintf(FILE * stream, const char * format, …); 根据参数format字符串来转换并格式化数据,然后将结果输出到stream指定的文件中,指定出现字符串结束符 ‘\0’ 为止。
int fscanf(FILE * stream, const char * format, …); 从stream指定的文件读取字符串,并根据参数format字符串来转换并格式化数据。
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); 以数据块的方式给文件写入内容
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); 以数据块的方式从文件中读取内容
int fseek(FILE *stream, long offset, int whence); 移动文件流(文件光标)的读写位置。
long ftell(FILE *stream); 获取文件流(文件光标)的读写位置。
void rewind(FILE *stream); 把文件流(文件光标)的读写位置移动到文件开头。
int feof(FILE * stream); 检测是否读取到了文件结尾。判断的是最后一次“读操作的内容”,不是当前位置内容(上一个内容)。

你可能感兴趣的:(C语言)