赞
踩
目录
1.什么是文件?
硬盘上用来储存数据的项目是文件;它分为数据文件和程序文件。
程序文件:
包括源程序文件(后缀.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。
数据文件:
文件的内容不一定是程序,而是程序运行时的读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。
二进制文件:数据在内存中以二进制的形式存储,若不加转化的输出到外存,就是二进制文件。
文本文件:如果要求在外存上以ASCII码的形式储存,则需要在储存前转化,以ASCII码的形式储存的文件就是文本文件。
数据在内存中可以以什么形式储存呢?
字符均以ASCII码值的形式储存,而整数可以以ASCII码值储存也可以以二进制形式储存。
比如将10000这个数据从 内存里储存到硬盘中的文件里,若不加转化直接以二进制形式储存,那这个文件叫二进制文件。如果加以转化以ASCII码值形式储存,这个文件就叫文本文件。
如何打开文本文件和二进制文件:
打开文本文件 选中test.c项目右击鼠标,找到打开所在的文件夹
双击文件,这样默认的打开方式是记事本
打开二进制文件:
在源文件中找到项目,右击选中打开方式,
选中二进制编译器,这样就可以以二进制方式打开文件了
我们程序需要将数据输出到各种外部设备,也需要将外部设备数据输入进来,不同的外部设备输入输出的方式不尽相同。于是抽象出流的概念,我们写的数据都放进流里,我们只从流中抽取我们需要的数据。一般情况从流里写数据或读数据都是先打开流,再进行操作。
概念很抽象,可以这样理解,流就是一条流淌着数据的河,数据输入输出都以这条河为载体,进行什么样的操作,便输入或输出什么样的数据。
标准流:
上文提到,进行数据的输入输出都要先打开流,但是我们平常从键盘上输入数据并没有打开流这一操作啊,其实C语言在启动的时候默认为使用者打开了三个流。
stdin:标准输入流,大多数环境中从键盘输入,scanf就是从标准输入流中读取数据。
stdout:标准输出流,大多数环境中将数据输出到显示器上,printf就是将数据输出到标准输出流中
stderr:标准错误流,大多数环境输出到显示器页面。
每一个被使用的文件在内存中开辟一个文件信息区用来存放文件的信息(文件的名字,路径),这些信息保存在结构体变量当中,这个结构体类型由系统声明:FILE
每当打开一个文件时,系统会自动生成一个FILE结构的变量并填充其中的信息,
一般通过FILE指针来维护FILE结构的变量。
下面创建一个FILE类型的指针变量
FILE*pf;//文件指针变量
定义pf是指向FILE类型的指针变量,可以使pf指向一个文本信息区,通过该文本信息中的信息找到相应的文件。
总结:通过文件指针能找到与它关联的文件。
文件在使用前要打开使用后要关闭,fopen来打开,fclose用来关闭
- FILE*fopen(const char*filename,const char mode);
- //filename为要打开的文件名,mode为打开的方式
-
- int fcolse(FILE*stream);
- //关闭文件
文件的打开方式有:
举例一种使用方式:
date.txt文件创建成功,并且里面写入了fopen example
fgetc:字符输入函数
Get character from stream:从流中得到字符,用于文件的读入。将文件的字符读取到内存里
FILE * stream:指文件指针
函数返回值为整型
先在vs中建立一个文件“data.txt”,在文件中输入abcdefgh
fputc:字符输出函数
Write character to stream:将字符写入流 int character, FILE * stream :放置字符,放置流(文件名)
fgets:文本行输入函数
Get string from stream:从流中读取字符串。
char * str:用来存放读取的字符
int num:要获得字符的个数 特别注意读取的字符总是为num-1,因为最后一个为‘/0’
FILE * stream:流/文件
fputs:文本行输出函数
Write string to stream:将字符写进流/文件 const char * str:要写入的字符 FILE * stream:流/文件
fscanf:格式化输入函数,适用于所有输出流
Read formatted data from stream:从流中读取格式化数据
FILE * stream:流/文件指针
const char * format:固定的格式化数据
fprintf:格式化输出函数,适用于所有输出流
Write formatted data to stream:将格式化的数据输出到流
const char * format:固定格式格化数据
fread:二进制输入函数,从流中读取数据块,适用于文件
void * ptr:读取数据块放入的位置
size_t size:数据块的大小
size_t count:数据块的个数
fwrite:二进制输出文件,以格式化的形式将数据块输出到文件
const void * ptr:要输出的数据块的地址
size_t size:数据块的大小
size_t count:数据块的个数
因为以二进制进行数据输出,所以在记事本上有些字符看不懂属于正常现象。
sprintf:将一个格式化数据转换成字符串
char * str:存放字符串的空间(地址)
const char * format:格式化数据
sscanf:将字符串转化成格式化数据
跟据文件光标的位置与偏移量定位光标
int fseek(FILE*stream,long int offest,int origin);
文件中每读取一个字符文件的光标都会向后走一格,可以根据光标所在位置及与初始位置偏移量来定位光标。下面红色下划线的是光标
long int ftell(FILE*stream);
返回文件指针相对起始位置的偏移量;
使文件光标回到起始位置
void rewind(FILE*stream);
feof函数:判断判断文件是否因为遇到文件为而结束,
文本文件:
使用fgetc正常结束返回EOF
使用fgets正常结束返回NULL
二进制文件:
读取是否正常结束,判断其返回值是否小于实际要读的个数
例如使用fread判断返回值是否小于实际要读的个数。
文本文件判断流程:
二进制文件判断流程:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。