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