C语言--文件操作
目录一认识文件1文件名2两种文件二文件操作1认识流和标准流2文件指针3文件的打开与关闭三文件的顺序读写1fputc和fgetc2fputs和fgets3,fprintf和fscanf4fwrite和fread四输入流和输出流1所有输入流2所有输出流3格式化数据的含义4两组函数功能的对比5补充函数sprintf和sscanf五文件的随机读写1fseek2ftell3rewind六文件读取结束的判定1判定读取结束2文件的拷贝七文件缓冲区一认识文件1文件名文件名分为三部分文件路径文件名主干文件后缀例如D:/code/test.cD:/code 就是文件路径test就是文件主干 .c就是文件后缀决定了文件的默认打开方式注意1文件名不能包含的字符\ / : * ? |2文件名不一定包含后缀名2两种文件从程序设计的角度有两种文件程序文件、数据文件为什么要使用文件当我们不使用文件时写的程序数据存储电脑的内存中执行完后内存就释放数据就丢失了如果想要数据完整并永久保存就需要使用文件。1程序文件程序文件包括源程序文件后缀为.c、目标文件后缀为.obj、可执行程序后缀为.exe2数据文件数据文件是程序进行执行时需要从中读取数据的文件或者输出内容的文件。其中数据文件又被分为文本文件和二进制文件二进制文件数据在内存中以二进制的形式存储不加任何形式的转化直接存入外存的文件。文本文件内存中的数据经过ASCII码值转化到外存中以ASCII字符形式存储的的文件。数据是如何存储到文件中的如果是字符就以ASCII码值的形式存储如果是数值型的数据则可以以ASCII码值的形式存储也可以以二进制的形式存储例如有整数10000想要进行存储则以ASCII码值存储需要5个字节以二进制存储需要4个字节二文件操作文件操作分为三步1打开文件 2读写文件 3关闭文件在真正进行文件操作前首先要认识流和标准流的概念1认识流和标准流在执行程序时我们需要从外部设备获取数据同时也需要输出数据到外部设备中不同的设备的输入输出的操作方式不一样。如下图为了方便操作引出了流的概念之后我们进行数据的写入和输出只需要操作流即可。标准流C语言在启动时就会默认打开三个流stdin:标准输入流通常来自键盘文件或其他程序的输入scanf就是从标准流中读取数据。stdout:标准输出流通常输出到屏幕文件中printf函数就是将信息输出到标准输出流中。stderr:标准错误流通常输出到屏幕上。stdin、stdout、stderr这三个流的类型都是FILE*称为文件指针。C语言中就是通过FILE*的文件指针来维护流的各种操作的2文件指针每一个文件在内存中都被开辟了一个文件信息区结构体这个文件信息区用来存放文件的相关信息。该结构体通用起名为FILE。该结构体的地址就是文件指针文件指针通过地址找到文件信息区文件信息区再找到文件。创建一个文件指针FILE* pf;3文件的打开与关闭打开文件语法FILE* fopen(const char* filename,const char* mode);filename为打开的文件名主干加后缀mode表示打开方式有以下打开方式关闭文件语法int fclose(FILE* stream);stream为文件指针流举例三文件的顺序读写1fputc和fgetcfputc函数核心功能向文件中写入单个字符语法int putc(int c,FILE* stream);c为要写入的字符stream表示文件指针流成功时返回写入的字符的ASCII码值失败时返回EOF(-1)使用案例fgetc函数核心功能从文件中读取单个字符语法int fgetc(FILE* stream);stream为文件指针流成功时返回读取到的字符的ASCII码值失败时或读取到文件末尾返回EOF(-1)使用案例2fputs和fgetsfputs函数核心功能向文件中写入字符串语法int fputs(const char str,FILE* stream);str是要输入的字符串stream是文件指针流成功时返回非负整数失败时返回EOF(-1)使用案例fgets函数核心功能从文件中读取一行字符串语法char* fgets(char* str,int n,FILE* stream);str为用于存储字符串的字符数组n表示从文件中取出的字符个数算上\0所以实际取出n-1个字符stream表示文件指针流成功时返回指向str的指针失败或者到文件末尾时返回NULL使用案例当n-1小于字符个数时先打印n-1个下次循环打印剩下部分当n-1大于字符个数时打印完即可3,fprintf和fscanf1,fprintf函数类比printfint printf(const char* format……)核心功能与printf类似不过printf是将内容输出到标准输出(一般是屏幕)而fprintf函数是将内容输出到指定的文件流或标准流当中头文件#include stdio.h语法int fprintf(FILE *stream,const char* format……);stream(文件指针 )指向已经打开的文件流format为格式化的字符串与printf中的内容相同返回值成功时返回写入的字符数失败时返回负数运用实例2fscanf函数类比scanfint scanf(const char* format,……核心功能与scanf类似scanf为将格式化数据输出到标准输出流中 fscanf为从指定的输入流文件流或标准流中读取数据头文件#include stdio.h语法int fscanf(FILE *stream,const char* format,……);参数含义与fprintf相同返回值成功时返回读取到的数据个数读到文件末尾或发生错误时返回EOF(-1)运用展示结果张三 20 65.500000上述是输出到文件流当中的情况将内容输出到标准输出流当中的情况:结果在屏幕上打印张三 20 65.5000004fwrite和freadfwrite函数核心功能以二进制的形式将原始内存数据写入到文件当中适合非文本数据图像音频结构体数组等的写入语法size_t fwrite(const void *ptr,size_t size,size_t nmemb,FILE *stream);ptr:要写入的内存块的指针size:要写入的一个数据项的大小nmemb要写入的数据项的数量stream文件指针流指向要被写入的文件返回值成功时输出成功传入的数据项的个数如果与nmemb不相等表示写入出错或到达文件末尾运用实例fread函数核心功能从文件中以二进制形式读取原始内存数据适合读取非文本数据。语法size_t fread(void* ptr,size_t size,size_t nmemb,FILE *stream);参数内容含义与fwrite函数一样不过改成从pf中读取数据到ptr当中返回值成功读取的数据项数量如果返回值小于nmemb,则可能表示1到达文件末尾(EOF)2读取错误3实际读取的项数不足运用实例运行结果1 2 3 4 5四输入流和输出流1所有输入流1标准输入流--stdin--键盘输入函数scanf, getchar, gets.2,文件输入流--FILE* 打开的文件只读r函数fscanf, fgets, fgetc, fread3,字符串输入流--从字符串中读数据函数sscanf2所有输出流1标准输出流--stdout 通常输出到屏幕中 printf就是将内容输出到标准输出流当中2标准错误输出--stderr 打印错误信息(通常是屏幕)3stdprn--不常用3格式化数据的含义格式化数据按照固定格式读写的数据格式化就是将数据转化为人类能看懂的文本用格式说明符控制%d %f %c %s非格式化看不懂供机器使用例如fread,fwrite4两组函数功能的对比5补充函数sprintf和sscanfsprintf函数核心功能把格式化数据转化成字符串传入到字符数组当中头文件#include stdio.h语法int sprintf(char* str,const char* format……)str为指向目标字符数组的指针用于存放生成的字符串。字符指针的大小必须足够大容纳输入的所有的内容。format:名为格式化的字符串与printf中的类似。返回值如果成功则返回写入的字符总数(不包括结尾的\0)如果失败则返回一个负数。sscanf函数核心功能从字符串中读取格式化数据到变量中头文件#include stdio.h语法int sscanf(const char *str,const char format,……)str源字符串从中读取数据format:格式化字符串与scanf中的类似。返回值成功读入并赋值的变量个数一个都没有读入进去返回0在第一个读入前就结束返回EOF(-1)运用实例五文件的随机读写1fseek核心功能根据文件指针的位置和偏移量改变文件指针位置语法int fseek(FILE *stream,long int offset,int origin);stream表示文件指针流offset表示偏移量可正可负origin表示起始位置有三个取值1,SEEK_SET(0)从文件开头开始2,SEEK_CUR(1)从当前位置开始3,SEEK_END(2)从文件末尾开始返回值如果成功返回0如果失败返回非零值运用展示2ftell核心功能返回文件指针相对于起始位置的偏移量语法long int ftell(FILE *stream);stream表示文件指针流返回值如果成功返回相对起始位置的偏移量失败则返回-1L(长整型的-1)运用实例3rewind核心功能让文件指针返回到文件的起始位置语法void rewind(FILE *stream);stream为文件指针流六文件读取结束的判定1判定读取结束打开一个流的时候这个流上有两个标记值1是否遇到文件末尾2是否发生错误这两种情况是文件读取结束的两种原因进行读取时使用这两种函数1fgetc--如果读取正常返回读取到的字符的ASCII码值如果读取失败或遇到文件末尾就返回EOF(-1)2,fgets--如果读取正常返回存储读取到的字符串的字符数组的地址如果读取失败或遇到文件末尾就返回NULL此时再通过两个函数判断文件读取结束的原因1判断是否遇到文件末尾int feof(FILE *stream);如果到达末尾就返回非零值没到达末尾就返回02判断是否发生错误int ferror(FILE *stream);出现错误返回非零没有错误返回0运用实例2文件的拷贝七文件缓冲区内存不会直接向硬盘/文件输入数据而是会先将数据输送到文件缓冲区当中然后当缓冲区装满时再通过文件缓冲区传入硬盘/文件当中。从磁盘/文件中读取数据也是同理会先将数据读取到文件缓冲区当中再将数据逐个传入到程序数据区当中。文件缓冲区的大小由编译器决定。