C文件读写
文件操作1 基本介绍文件,对我们并不陌生,文件是数据源(保存数据的地方)的一种,比如大家经常使用的word文档,txt文件,excel文件,都是文件,文件最主要的作用就是保存数据,它既可以保存一张图片,也可以保存视频,声音...1.1 文件在程序中是以流的 形式来操作的C程序(内存)<-----------------------输入流(读文
文件操作
1 基本介绍
文件,对我们并不陌生,文件是数据源(保存数据的地方)的一种,比如大家经常使用的word文档,txt文件,excel文件,都是文件,文件最主要的作用就是保存数据,它既可以保存一张图片,也可以保存视频,声音...
1.1 文件在程序中是以流的 形式来操作的
C程序(内存)<-----------------------输入流(读文件)-----------------文件
C程序(内存)<----------------------输出流(写文件)-----------------文件
流:数据在数据源(文件)和程序(内存)之间经历的路径
输入流:数据从数据源(文件)到程序(内存)的路径
输出流:数据从程序(内存)到数据源(文件)的路径
1.2 相关函数在stdio.h
C标准库-stdio.h该头文件定义了三个变量类型,一些宏和各种函数来执行输入和输出,在开发过程中,可以来查询
2 C输入&输出
当我们提到输入时,这意味着要向程序写入一些数据,输入可以是以文件的形式或命令行中进行。C语言提供了一系列内置函数来读取给定的输入,并根据需要写入到程序中
当我们提到输出时,这意味着要在屏幕上,打印机上或者任意文件中显示一些数据,C语言提供了一系列内置的函数来输出数据到计算机屏幕上和保存到文本或二进制文件中
3 标准文件
C语言把所有的设备都当作文件,所以 设备(比如显示器)被处理的方式与文件相同,以下三个文件会在程序执行时自动打开,以便访问键盘和屏幕
标准文件 | 文件指针 | 设备 |
---|---|---|
标准输入 | stdin | 键盘 |
标准输出 | stdout | 屏幕 |
标准错误 | stderr | 您的屏幕 |
文件指针是访问文件的方式,讲解如何从屏幕读取值以及如何把结果输出到屏幕上
C语言中的I/O(输入/输出)通常使用printf()和scanf()两个函数。scanf()函数用于从标准输入(键盘)读取并格式化,printf()函数发送格式化输出到标准输出(屏幕)
案例演示,将内容输出但屏幕
#include<stdio.h>//执行printf()函数需要该库int main(){ printf("hello");//显示引号中的内容 return 0; }
4 getchar()&putchar()函数
int getchar()函数从屏幕读取下一个可用的字符,并把它返回为一个整数,这个函数在同一个时间内只会读取一个单一的字符,可以使用循环内使用这个方法,以便从屏幕上读取多个字符
int putchar(int c)函数把字符输出到屏幕上,并返回相同的字符,这个函数在同一个时间内只会输出一个单一的字符,可以在循环内使用这个方法,以便在屏幕上输出多个字符
应用实例:程序会读取一个单一的字符
#include<stdio.h>int main(){ int c; printf("Enter a value:"); c=getchar(); printf("you enterd"); putchar(c); printf("\n"); return 0; }
5 gets()&puts函数
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("you enterd"); puts(str); return 0; }
6 scanf()和printf()函数
int scanf(const char *format)函数从标准输入流stdin读取输入,并根据提供的format来浏览输入
int pirntf(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("you enter :%s %d",str,i); printf("\n"); return 0; }
7 C 文件读写
讲解了C语言处理的标准输入和输出,将介绍如何创建,打开,关闭文本或二进制文件
一个文件,无论它是文本文件还是二进制文件,都是代表了一系列字节,C语言不仅提供了访问顶层的函数,也提供了底层(OS)调用来处理存储设备上的文件
8 打开文件
使用fopen()函数来创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型FILE的一个对象,类型FILE包含了所有用来控制流的必要的信息
FILE *fopen(const char *filename,const char *mode);
说明:在这里,filename是字符串,用来命名文件,访问模式mode的值可以是下列值中的一个
如果处理的是二进制文件(图片,视频),则需使用下面的访问模式:"rb","wb",""ab","rb+","r+b","wb+"","w+b","ab+","a+b"//binary 二进制
函数的说明
模式 | 描述 |
---|---|
r | 打开一个已有的文本文件,允许读取文件 |
w | 打开一个文本文件,允许写入文件,如果文件不存在,则会创建一个新文件,在这里,程序会从文件的开头写入内容,如果文件存在,则该会被截断为零长度,重新写入 |
a | 打开一个文本文件,以追加模式写入文件,如果文件不存在,则会创建一个新的文件,在 这里,您的程序会在已有的文件内容中追加内容 |
r+ | 打开一个文本文件,允许读写文件 |
w+ | 打开一个文本文件,允许读写文件,如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件 |
a+ | 打开一个文本文件,允许读写文件,如果文件不存在,则会创建一个新文件,读取会从文件的开头开始,写入则只能是追加模式 |
9 关闭文件
关闭文件,使用fclose()函数,函数的原型如下:
int fclose(FILE *fp);
如果成功关闭文件,fclose()函数返回零,如果关闭文件时发生错误,函数返回EOF,这个函数实际上,会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存,EOF是一个定义在头文件stdio.h中的常量
C标准库提供了各种函数来按字符或者以固定长度字符串的形式读写文件
使用完文件后(读写),一定要将该文件关闭
10 写入文件
下面是把字符写入到流中的函数
int fputc(int c,FILE *fp);
说明:函数fputc()把参数c的字符值写入到fp所指向的输出流中,如果写入成功,它就会返回写入的字符,如果发生错误,就会返回EOF,可以使用下面的函数来把结尾的字符串写入到流中
int fputs(const char *s,FILE *fp);
说明:函数fputs()把字符串s写入到fp所指向的输出流中,如果写入成功,它就会返回一个非负值,如果发生错误,就会返回EOF,可可以使用int fprintf(FILE *fp,const char *format)函数来写把一个字符串写入到文件中
代码演示
#include<stdio.h>void main(){ //创建一个文件指针 FILE *p=NULL; //打开该文件 fp=fopen("d:/test100.txt","w+");//w+模式是 文件会被截断为零长度 //将内容写入到文件中 fprintf(fp,"你好,北京"); fputs("你好,上海",fp); //关闭文件 fclose(fp); printf("创建,写入信息完成"); getchar(); }
11 读取文件
下面是从文件读取单个字符的函数
int fgetc(FILE *fp);
说明:fgetc()函数从fp所指向的输入文件中读取一个字符,返回值是读取的字符,如果发生错误则返回EOF
下面的函数从流中读取一个字符串:
char *fgets(char *buf,int n,FILE *fp);
说明:函数fgets()从fp所指向的输入流中读取n-1个字符,他会把读取的字符复制到缓冲区buf,并在最后追加一个null字符来终止字符串
如果这个函数在读取最后一个字符之前就遇到一个换行符'\n'或文件的末尾EOF,则只会返回读取到的字符,包括换行符
也可以使用int fscanf(FILE *fp,const char *format)函数来从文件中读取字符串,但是在遇到第一个空格字符时,它会停止读取;
代码演示
#include<stdio.h>void main(){ //创建一个文件指针 FILE *fp=NULL; //定义一个缓冲区 char buff[1024]; //打开文件 //方法1 fp=fopen("d:test200.txt","r"); fscanf(fp,"%s",buff); //输出 printf("%s",buff); //方法2 读取整个文件 //说明 循环读取fp指向的文件内容,如果读到NULL,就结束 while(fgets(buff,1024,fp)!=NULL){ printf("%s",buff); } //关闭文件 fclose(fp); getchar(); }