C语言学习笔记——文件操作
注该笔记基于B站up尚硅谷的C语言教程视频【尚硅谷C语言零基础入门教程宋红康c语言程序设计精讲含C语言考研真题】 https://www.bilibili.com/video/BV1Bh4y1q7Nt/?share_sourcecopy_webvd_source888f84d6f6569e62ce9b7c4648b240371.文件和流的介绍文件是数据源保存数据的地方的一种比如经常使用的word文档txt文件excel文件avi文件...都是文件。文件最主要的作用就是保存数据它既可以保存一张图片也可以保持视频声音...C程序中对于文件中数据的输入/输出操作以“ 流(stream) ”的方式进行可以看做是一种数据的流动。输入流数据从数据源(比如:文件)到程序(或内存)的流动过程。输出流数据从程序(或内存)到数据源(比如:文件)的流动过程。2.C输入输出当我们提到输入时这意味着要向程序(或内存)中写入一些数据。输入的数据来源可以是从键盘中、从文件中或从网络中。C 语言提供了一系列内置的函数来读取给定的输入并根据需要写入到程序中。当我们提到输出时这意味着要在屏幕上、打印机上或任意文件中显示(或保存)一些数据。同样C 语言提供了一系列内置的函数来输出数据到指定的载体上。2.1 标准文件I/OC 语言把所有的设备都当作文件。所以设备比如显示器被处理的方式与文件相同。以下三个文件会在程序执行时自动打开以便访问键盘和屏幕。标准文件文件之指针设备标准输入stdin键盘标准输出stdout屏幕标准错误stderr屏幕2.2 scanf()和printf()函数C 语言中的 I/O 输入/输出通常使用printf() 和scanf() 两个函数。int scanf(const char *format, ...)函数从标准输入流 stdin 读取输入并根据提供的 format 来浏览输入。int printf(const char *format, ...)函数把输出写入到标准输出流 stdout 并根据提供的格式产生输出。其中format 可以是一个简单的常量字符串但是您可以分别指定%s、%d、%c、%f 等来输出或读取字符串、整数、字符或浮点数。如需了解完整的细节可以查看这些函数的参考手册。举例将内容输出到屏幕#include stdio.h int main( ) { char str[100]; int i; printf( Enter a value :); scanf(%s %d, str, i); printf( \nYou entered: %s %d , str, i); printf(\n); return 0; }2.3 getchar()和putchar()int getchar(void)函数从屏幕读取下一个可用的字符并把它返回为一个整数。这个函数在同一个时间内只会读取一个单一的字符。可以在循环内使用从屏幕上读取多个字符。int putchar(int c)函数把字符输出到屏幕上并返回相同的字符。这个函数在同一个时间内只会输出一个单一的字符。可以在循环内使用在屏幕上输出多个字符。举例程序会读取一个单一的字符#include stdio.h int main( ){ int c; printf( Enter a value :); c getchar(); printf( \nYou entered: ); putchar(c); printf(\n); return 0; }2.4 gets()和purs()char *gets(char *s) 函数从stdin读取一行到 s 所指向的缓冲区直到一个终止符或EOF。int puts(const char *s) 函数把字符串s 和一个尾随的换行符写入到stdout。举例程序读取一整行直到该行结束。#include stdio.h int main( ){ char str[100]; printf( Enter a value :); gets(str); printf( \nYou entered: ); puts( str ); return 0; }3.C文件的读写一个文件无论它是文本文件还是二进制文件都是代表了一系列的字节。C 语言不仅提供了访问顶层的函数也提供了底层调用来处理存储设备上的文件。3.1 创建/打开文件使用 fopen( ) 函数来创建一个新的文件或者打开一个已有的文件这个调用会初始化类型 FILE 的一个对象类型 FILE 包含了所有用来控制流的必要的信息。函数原型FILE *fopen( const char * filename e, const char * mode);说明在这里filename是字符串用来命名文件访问模式mode的值可以是下列值中的一个。模式描述r只读。打开一个已有的文件只允许读取。w只写。打开一个文本文件只允许写入文件。如果文件不存在则会创建一个新文件。并从文件的开头写入内容。如果文件存在则截断文件为零长度从开始写入a追加。打开一个文本文件用于写入。如果文件不存在则创建一个新文件。如果文件已经存在则将写入的数据追加到文件的末尾。rb只读二进制。打开一个二进制文件只允许读取。wb只写二进制。打开一个二进制文件用于写入。如果文件不存在则创建一个新文件。如果文件已经存在则截断文件为零长度从开始写入ab追加二进制。打开一个文本文件用于写入。如果文件不存在则创建一个新文件。如果文件已经存在则将写入的数据追加到文件的末尾。模式描述r读写。打开一个文件允许读取和写入w读写。打开一个文本文件允许读取和写入。如果文件不存在则创建一个新文件。如果文件已存在则截断文件为零长度从开始写入a读写。打开一个文本文件允许读取和写入。如果文件不存在则创建一个新文件。如果文件已存在则将写入的数据追加到文案末尾。rb或 rb 读写二进制 。打开一个二进制文件允许读取和写入。wb或 wb 读写二进制 。打开一个二进制文件允许读取和写入。如果文件不存在则创建一个新文件。如果文件已存在则截断文件为零长度。ab或 ab 读写二进制 。打开一个二进制文件允许读取和写入。如果文件不存在则创建一个新文件。如果文件已存在则将写入的数据追加到文件末尾。技巧这些访问模式字符串可以根据需要进行组合使用。例如r 表示读写rb 表示读写(二进制)。注意如果处理的是二进制文件图片视频..则需使用下面的访问模式 rb, wb, ab, rb, rb, wb, wb, ab, ab。3.2 关闭文件使用完文件后读、写一定要将该文件关闭。关闭文件使用fclose()函数。函数原型int fclose(FILE *fp);如果成功关闭文件fclose( ) 函数返回零。此时会清空缓冲区中的数据关闭文件并释放用于该文件的所有内存。如果关闭文件时发生错误函数返回 EOF。EOF 是一个定义在头文件stdio.h中的常量。3.3 写入文件C 标准库提供了各种函数来按字符或者以固定长度字符串的形式读/写文件。fputc函数函数原型int fputs(int c, FILE *fp);说明函数 fputc() 把参数c 的字符值写入到 fp 所指向的输出流中。如果写入成功 它会返回写入的字符如果发生错误则会返回 EOF。fputs 函数函数原型int fputs(const char *s, FILE *fp);说明函数fputs() 把字符串 s 写入到 fp 所指向的输出流中。如果写入成功它会返回一个非负值如果发生错误则会返回 EOF。fprintf函数函数原型int fprintf(FILE *fp,cons t char *format, ...);功能与fputs()类似将一个字符串写入到文件中。#include stdio.h int main() { //创建一个文件指针 FILE *fp NULL; //打开该文件 fp fopen(d:/hello.txt, w); //w模式是:如果文件已存在则截断文件为零长度。 //fp fopen(d:/hello.txt, a); //a模式是:如果文件已存在则将写入的数据追加到文件末尾。 //将内容写入到文件中 fputs(你好北京\n, fp); fprintf(fp, 你好世界\n); //关闭文件如果不关闭 我们的内容没有保存到文件中! fclose(fp); printf(创建写入信息完成); return 0; }3.4 读取文件fgetc函数函数原型int fgetc(FILE *fp);说明fgetc() 函数从fp 所指向的输入文件中读取一个字符。返回值是读取的字符 如果发生错误则返回 EOF。fscanf函数函数原型int fscanf(FILE *fp, const char *format, ...);说明使用 fscanf() 函数从文件中读取格式化的数据比如整数、浮点数等各种类型的数据。format 参数指定了数据的格式后面的参数是用于存储读取数据的变量。如果使用 fscanf() 函数从文件中读取字符串会在遇到第一个空白字符空格、制表符、换行符等时停止读取之后的内容会被忽略。如果函数成功读取了一些数据并按照指定格式存储到相应的变量中它会返回成功读取的参数个数。或者在读取失败或文件结束时返回 EOF。fgets函数函数原型char *fgets(char *buf, int n, FILE *fp);说明此函数按行读取数据它从文件中读取一行数据包括换行符\n并将这一行的内容存储到指定的缓冲区中。参数中 buf 是用于存储读取的文本的缓冲区n 是缓冲区的大小fp 是文件指针。如果成功读取返回参数 buf即读取到的字符串的首地址。如果到达文件末尾或者读取失败返回NULL。举例#include stdio.h int main() { //创建一个文件指针 FILE *fp NULL; //定义一个缓冲区 char buff[1024]; //打开文件 fp fopen(d:/hell.txt, r); //方法1 //fscanf(fp, %s, buff); ////输出 //printf(%s\n, buff); //方法2 读取整个文件 //说明循环读取fp指向的文件内容如果读到NULL,就结束 while (fgets(buff, 1024, fp) ! NULL) { printf(%s, buff); } //关闭文件 fclose(fp); return 0; }