文件的分类
本文知识点对象为数据文件,文本文件:在外存中以ASCII存储,存储到内存中时需要转化为二进制。二进制文件:数据在内存中以二进制形式存储,且在外存中也以二进制形式存在。
流
流(stream):可以理解为一长串连续的数据,它通常用来处理数据和传输数据。有标准输入/出流、文件输入/出流、网络流等,本文主要探讨的是标准输入/出流、文件输入/出流。
FILE*文件指针、文件打开方式、fclose
每一个文件的名称、类型、存储位置的信息等都会放在一个FILE类型的结构体变量里,在内存中都有一个对应的文件信息区用以存储它们。(FILE类型由系统声明)。
文件指针:类型:FILE*,通过文件指针可以找到文件信息区,进而通过文件读写接口(文件操作函数)对文件里的内容进行读写操作。
打开文件的方式:
fclose:对文件打开后,要进行关闭文件操作(同时最好将文件指针置为空指针),
注:如果文件模式为读(或写),不要对它进行写(或读)的操作,否则会发生错误。
int main(){
FILE* pf=("test.txt", "w");//只写,如果没有文件“test.txt”,将会自动生成一个
/*
进行写的操作。
*/
fclose(pf);
pf=NULL;
return 0;
}
我们在使用printf和scanf等函数时,没有进行打开流的操作,是因为C语言程序默认打开了标准输入流(stdin,scanf从标准输入流中读取数据)、标准输出流(stdout,printf将信息输出到标准输出流上)、标准错误流(stderr)。
文件输入/输出函数
以下函数都需包含头文件#include<stdio.h>
典型的标准输出函数为printf,其将格式化的数据输出到标准输出流上并在控制台上打印,标准输入函数有scanf,计算机通过标准输入流(键盘输入)读取格式化的数据。
而文件输入/输出函数有:
输入流
fgetc
int fgetc (FILE* stream):从输入流中读取字符,每一次调用fgetc,文件指针都会向后移一位,返回值为该字符的ASCII值,若读取失败,将返回EOF。
fgets
char* fgets (char* str, int num, FILE* stream):从文件读取一行的num个字符放入字符串str中(不满num个也不会向下一行读取),直到读取到num个/换行符('\n')/文件末尾,并返回一个指向str的指针,若遇到文件末尾或读取错误,将返回NULL。(可以读取任何字符,包括'\n’、空格符等)。
fscanf
int fscanf (FILE* stream , const char* format, .....):从文件流中读取数据,并将解析到的数据放入相应的变量中。返回值:若成功匹配并赋值给了所有的参数,将返回参数数量,若文件流结束或发生错误,将返回EOF,若如果遇到与格式字符串不匹配的输入项,则停止扫描并返回已成功匹配的参数数量。
输出流
注:如果文件打开模式进行输入不是类似于"a+"这种的而是"w",则每次打开写入的内容都会覆盖上一次的内容。
fputc
int fputc (int character, FILE* stream):参数1为要输出的字符,参数2为要指向写入的文件文件指针。
fputs
int fputs (const char* str, FILE* stream):参数1为要写入的字符串,参数2为要指向写入的文件文件指针。
fprintf
int fprintf (FILE* stream, const char* format, .......):第一个参数为要写入的文件流,第二个参数为格式化的字符串,将其写入指定的文件流中,写入成功将返回成功写入的字符数,发生错误将返回EOF。
fread和fwrite
这两个函数操作的是二进制数据块,而不是字符,因此区别于上列函数,可以输入/出任意类型的数据,而不单单是字符。
fread
size_t fread (void* ptr, size_t size, count, FILE* stream):参数1为指向要存储读取数据的缓冲区的指针,参数2为每个元素的字节大小,参数3为要读取的字符个数。返回值为实际读取到的字符个数。(可以读取任意类型的字符)。
fwrite
size_t fwrite (const void* str, size_t size, size_t count, FILE* stream):参数1为指向要写入的数据的指针,参数2为每个写入的元素的大小,参数3为要写入的个数。
对文件指针位置的操作(fseek、ftell、rewind)
它们可以在任何打开模式下对文件指针进行操作"r"、"w"、"wb"等等。
fseek
int fseek (FILE*stream, long int offset, int origin):。参数3有三种:1.SEEK_SET(代表文件起始位置) 2.SEEK_CUR(代表文件指针当前的位置) 3.SEEK_END(代表文件的末尾位置)。参数2为相对于参数3代表的位置的偏移量。
ftell
long int ftell (FILE* stream):该函数的作用是找到文件指针所在的位置,并返回此时文件指针相对于起始位置的偏移量。
rewind
void rewind (FILE* stream):作用是将文件指针移动到文件起始位置。
判读文件是否正常读取
- 当fgtec读取到文件末尾会返回EOF,fgets读取到末尾会返回NULL,可以参照它们的返回值判断是否读取结束。
- 使用feof()函数,当应用feof(fgetc)或feof(fgets),读取到文件末尾,feof会返回非负值。
- 使用fread,将它的返回值(实际读取到的元素个数)同文件内的元素个数比较。
完。