1.为什么要使用文件 内存是易失性存储介质,很容易造成数据丢失,使用文件之后,数据就会被保存在硬盘(持久性存储介质)上,做到了数据的持久化。磁盘上最典型的存储单元就是文件。
2.什么是文件 文件:把信息写在磁盘上的一种保存数据的载体。 按文件的类别分(工程师视角):程序文件和数据文件 。 文件内容角度:文件包含文件内容和文件属性(大小、时间、类别等等),即文件=内容+属性,所以 创建一个空文件要占用磁盘空间。
文件名:文件路径+文件名主干+文件后缀。(例如:c:\class\text.txt)通过路径和文件名就能找到对应的文件。‘\ ’称为路径分隔符
3.文件的打开与关闭 FILE ,一个结构体类型,用来存放文件的的相关信息。 FILE* , 文件类型指针,通俗讲,叫句柄 。通过文件指针,能够找到与之相关联的文件。 FILE * fopen ( const char * filename, const char * mode ); 第一个参数表示要打开哪一个文件,可以带路径,也可以直接是文件名,默认为当前路径(例如:在VS2013中,源代码在哪个路径下,打开文件就在那个路径)。第二个参数表示打开文件的方式,读、写、等等。
打开的方式:
w | 只写,覆盖写,每次都从文件开头写(写入之前会清空文件内容),如果没有文件,则会自动创建。 |
r | 只读。 |
a(append) | 追加写,在文件末尾继续写。 |
wb | 以二进制的方式写 |
rb | 以二进制的方式读 |
ab | 向一个二进制文件尾添加数据 |
w+ | 以读写方式打开,如果没有文件,则会自动创建。 |
r+ | 以读写方式打开。 |
int fclose ( FILE * stream ); 关闭文件,若关闭成功,返回一个非零的值,若关闭失败,返回零。
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
c可执行程序(几乎任何语言):默认运行的时候,都会打开三个设备(文件) 键盘(标准输入:stdin) 显示器(标准输出:stdout) 显示器(标准错误:stderr)
文件的顺序读写:(修改文件的内容)
int fgetc ( FILE * stream ); | 从指定文件中读取字符 返回指定流的内部文件位置指示符当前指向的字符。然后,内部文件位置指示器前进到下一个字符。 成功时,返回读取的字符(提升为int值)。 返回类型为int,以适应特殊值EOF,表示故障: 如果调用时流位于文件末尾,则函数返回EOF并设置流的文件末尾指示符(feof)。 如果发生读取错误,函数将返回EOF并设置流的错误指示符(ferror)。 |
int fputc ( int character, FILE * stream ); | 将字符写入指定文件 将字符写入流并使位置指示器前进。 字符被写入流的内部位置指示器指示的位置,然后自动前进1。 成功时,将返回写入的字符。 如果发生写入错误,则返回EOF并设置错误指示符(ferror)。 |
int fputs ( const char * str, FILE * stream ); | 将字符串写入文件 将str指向的C字符串写入流。 函数从指定的地址(str)开始复制,直到到达终止的空字符('\0')。此终止空字符不会复制到流中。 成功时,将返回一个非负值。 出错时,函数返回EOF并设置错误指示符(ferror)。 |
char * fgets ( char * str, int num, FILE * stream ); | 从流中获取字符串(从文件中读取字符串) 从流中读取字符并将其作为C字符串存储到str中,直到读取(num-1)个字符或到达换行符或文件结尾,以先发生的为准。 换行符使FGET停止读取,但函数认为它是有效字符,并包含在复制到str的字符串中。 在复制到str的字符之后,将自动追加终止的空字符。 如果读取成功,函数返回str,如果读取失败,将设置错误指示(ferror),并返回NULL指针,如果读到文件末尾,将eof指示符(feof),并返回NULL指针 |
int fprintf ( FILE * stream, const char * format, ... ); | 将格式化数据写入流,按照特定的格式要求,用后续的参数的内容(...)替换字符串中的内容(const char * format),再把它写入指定的流(FILE * stream)中。如果没有经过格式化,它会将字符串内容(const char * format)全部作为字符依次写入。 |
int fscanf ( FILE * stream, const char * format, ... ); | 从流中读取格式化数据 从流中读取数据,并根据参数格式将其存储到附加参数所指向的位置。 附加参数应指向已分配的对象,该对象的类型由格式字符串中相应的格式说明符指定。 |
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream ); | 将数据块写入流 参数const void * ptr表示要写入的值,size_t size表示写入的基本单元,size_t count表示写入的个数,写入文件的总大小为size*count。 |
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream ); | 从流中读取数据块 void * ptr表示要读到哪,size_t size表示要读的基本单元,size_t count表示期望读多少个 返回值为实际读到的个数。(实际读到的<期望读到的) |
文件的随机读写:(操作文件的属性)
long int ftell ( FILE * stream ); | 返回流的位置指示器的当前值。 对于二进制流,这是从文件开头开始的字节数。 对于文本流,数值可能没有意义,但仍可以用于稍后使用fseek将位置恢复到相同位置 |
int fseek ( FILE * stream, long int offset, int origin ); | 重新定位流位置指示器,参数long int offset为偏移量,参数int origin用作偏移的参考位置。origin有三种情况:1.设置为SEEK_SET,即文件的开头;2.设置为SEEK_CUR,即文件指定的当前位置;3.设置为SEEK_END,即文件的末尾。 |
void rewind ( FILE * stream ); | 将流的位置设置为开始位置 |
查看文件大小 :
文本文件与二进制文件:
数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。