// 命令行参数
// 命令行参数用于向程序传递在执行阶段才确定的数据
// 提升软件的可移植行
int main(int argc, char *argv[])
{
//argc命令行参数的个数
//argv[][]字符串数组,每一行保存一个命令行参数
//argv[0]
//argv[1]
//...
//argv[argc-1]
int i = 0;
//[0,argc)
for(i = 0; i < argc; i++)
{
printf("argv[%d] : %s\n", i, argv[i]);
}
一、文件:存储在外部介质上数据的集合,是操作系统数据管理的单位。c语言把文件看做是一个字符的序列。就是说文件是由字符组成的一个个字符流。因此c语言也将文件称作流。
二、c语言支持2种类型的文件:
1.二进制文件
以补码的形式存储。显示的时候是以文本的方式打开的话会看不懂,因为文本是一个字节一个字节的显示
2.文本文件
以ASCii码格式存放,把每个数据当做一个字符,即把字符相应的ASCII码化成二进制存储,所以一个字符占一个字节,显示的时候按字符显示,故以文本的方式打开就能看得懂
三、文件的分类:
从用户的角度看:
特殊文件:标准输入输出文件(stdin(键盘),stdout(显示屏)),标准错误(stderr(显示屏))
普通文件:磁盘文件
从操作系统角度来看:每一个与主机相连的输入输出设备都看做是一个文件
例如:输入文件:键盘, 输出文件:显示屏,打印机
四、文件操作:
针对指定目录下的文件进行简单的读写操作
五、补充:文件的应用
1.静态数据储存,
六、文件类型结构体:FILE
文件西in西用系统定义的名为FILE的结构体描述,该结构体定义在stdio.h文件中。我们可以直接用
用法:成功打开文件的时候,系统会自动建立文件结构体,该结构体包含描述该文件的所有的信息,然后返回出一个指针,该指针就指向该结构体,为了便于理解,可以把该指针看做是指向该文件的指针,程序可以通过该指针访问这个文件。在文件关闭后,该文件结构体就会被释放。
打开一个文件:
功能:以指定的模式打开指定路径下的文件,返回⼀个关联该文件的文件指针作为唯一识别标志。
参数:
path:用于指定文件路径;比如/home/user/Desktop/hello.c
mode:用于指定文件的操作模式,常用的模式有r,r+,w,w+,a,a+
函数: FILE *fopen(char *filename,char *mode);
返回值:正常打开,返回指向文件(文件结构体)的指针
失败, 返回NULL
打开方式:
r:以只读的方式打开一个文本文件
rb:以只读的方式打开一个二进制文件
w:以只写的方式打开一个文本文件
wb:以只写的方式打开一个二进制文件
a:以追加的方式打开一个文本文件
ab:以追加的方式打开一个二进制文件
r+:以读写的方式打开一个文本文件
rb+:...................................二进制文件
w+;以读写的方式打开文本文件
wb+:以读写的方式打开一个二进制文件
a+:以读写的方式打开一个文本文件
ab+:.....................................二进制文件
关闭一个文件:
函数: int fclose(FILE *fp)
功能:关闭fp指向的文件,释放文件结构体和文件指针
返回值: 成功,返回0
失败,非0
例:
#include
#include
void main()
{
int a;
FILE *fp;
fp=fopen("2.c","a");
if(fp==NULL)
{
printf("open is failed!\n");
exit(0);
}
a=fclose(fp);
if(a==0)
printf("clost is success!\n");
else
printf("close is failed!\n");
fp=NULL;//防止成为野指针
}
/*
1.若文件在当前路径下:
fp=fopen("文件名","r");
2.若文件不在当前目录下:
fp=fopen("文件的绝对路径","r");
3.若要手动输入打开的文件名
char filename[30];
scanf("%s",filename);
fp=fopen(filename,"r");
4.要对一个文件进行操作,必须先打开这个文件,操作完成之后,必须关闭这个文件,不关闭的话容易造成数据丢失,关闭之后使fp=NULL.
5.以r,r+的方式打开文件,若文件不存在,打开失败
w,w+,a,a+的方式发开文件,若文件不存在,则会自动创建同名文件6.以w/w+的方式打开文件会覆盖掉文件中之前的内容。
7.以a/a+的方式打开文件不会覆盖之前的内容,会接着之前内容继续写
*/
函数: char fputc(char ch,FILE *fp);
功能:把一个字符ch写到fp指向的文件中
返回值:正确,返回ch,
错误,返回EOF
EOF通常看做是一个特殊的字符理解,其实是头文件stdio.h中常量-1的宏定义。在linux中,它并不是一个特殊字符,它只是当系统读到文件结尾或者出错的时候所返回的一个信号值。
#include
void main()
{
char ch='a';
fputc(ch,stdout); //<=>putchar(ch);
fputc('\n',stdout);
}
函数:char fgetc(FILE *fp);
功能:从fp指向的文件中读取一个字符
返回值:正常,返回读取到的字符;当读到文件尾或者出错的时候,返回EOF.
#include
void main()
{
char ch;
ch=fgetc(stdin);
fputc(ch,stdout);
putchar('\n');
}
练习:将一个文件的内容读到另一个文件中去
#include
#include
void main()
{
char c,d;
FILE *fp1,*fp2;
fp1=fopen("2.c","r");
if(fp1==NULL)
{
printf("fopen 2.c failed!\n");
exit(0);
}
fp2=fopen("xxx.c","w");
if(fp2==NULL)
{
printf("fopen xxx.c is failed!\n");
exit(0);
}
while((c=fgetc(fp1))!=EOF)
{
d=fputc(c,fp2);
putchar(d);
}
fclose(fp1);
fclose(fp2);
fp1=NULL;
fp2=NULL;
}
函数:long ftell(FILE *fp);
功能:得知目前的文件读写指针的位置
返回值:正确,返回目前文件读写指针的位置,当前文件指针所在的位置距离文件开头的长度。
错误,返回-1.
#include
#include
void main()
{
FILE *fp;
long position;
if((fp=fopen("2.c","a"))==NULL)
{
printf("open failed!\n");
exit(0);
}
position=ftell(fp);
printf("%ld\n",position);
fclose(fp);
fp=NULL;
}
函数:int fscanf(FILE *fp,char *format,arg_list)
功能:从文件fp中获取输入,以一定的格式赋给后面的变量
fscanf(fp,"%s",name);
返回值:成功,返回输入的个数,出错或者到达文件的结尾,返回EOF
例:
#include
void main()
{
char name[20];
int age;
//scanf("%s%d",name,&age);
<=>
fscanf(stdin,"%s%d",name,&age);//fscanf(fp,"%s%d",name,&age);
printf("name=%s,age=%d\n",name,age);
}
函数:int fprintf(FILE *fp,char *format,arg_list);
功能:把变量的值按一定的格式输出到fp指向的文件中去
fprintf(fp,"%s",name);
返回值:成功,返回输入的个数,出错或者到达文件尾,返回EOF
例:
#include
void main()
{
char name[20];
int age;
fscanf(stdin,"%s%d",name,&age);
// printf("%s %d\n",name,age);
<=>
fprintf(stdout,"%s %d\n",name,age);
}
练习:从键盘按格式输入数据存到磁盘文件中去,并回显到屏幕上。
#include
#include
void main()
{
char name[20];
int age;
FILE *fp;
if((fp=fopen("xxx.c","w+"))==NULL)
{
printf("打开失败!\n");
exit(0);
}
fscanf(stdin,"%s %d",name,&age);
fprintf(fp,"%s %d",name,age);
fscanf(fp,"%s %d",name,&age);
fprintf(stdout,"%s %d\n",name,age);
}
函数:void rewind(FILE *fp)
功能:重置文件指针fp,使它指向文件的开头
#include
#include
void main()
{
FILE *fp;
if((fp=fopen("2.c","a"))==NULL)
{
printf("faile!\n");
exit(0);
}
long position=ftell(fp);
printf("%ld\n",position);
rewind(fp);//使文件指针fp指到文件的最开头。
position=ftell(fp);
printf("%ld\n",position);
fclose(fp);
}
函数:int fseek(FILE *fp,long offset,int whence)
功能: 使fp所指向的文件的读写指针位置重置到指定的位置,从whence位置移动offset个字符
返回值:成功0, 失败-1.
whence的值:
0:文件开头
1:当前指针所指的位置
2:文件尾
例:
fseek(fp,100L,0):将文件指针移到离文件头100个字节的位置
fseek(fp,50L,1):将位置指针从当前位置向后偏移50字符的长度
fseek(fp,-10L,2):将位置指针从文件尾倒移10个字节
#include
#include
void main()
{
FILE *fp;
long position;
if((fp=fopen("2.c","a"))==NULL)
{
printf("faile!\n");
exit(0);
}
position=ftell(fp);
printf("%ld\n",position);
fseek(fp,100L,1);
position=ftell(fp);
printf("%ld\n",position);
fseek(fp,100L,0);
position=ftell(fp);
printf("%ld\n",position);
}
函数:int fread(void *buffer,int num_bytes,int count,FILE *fp);
功能:从fp指向的文件中一次读取count个num_bytes字节大小的数据块到buffer中。
例:fread(&age,sizeof(int),1,fp);
返回值:成功,返回count;失败或者文件结束,返回0.
函数:int fwrite(void *buffer,int num_byte,int count,FILE *fp);
功能:从buffer中一次读取count个num_bytes字节大小的数据块到fp指向的文件中去
例:fwrite(&age,sizeof(int),1,fp);
返回值:成功,返回count;失败或者文件结束,返回0.
例:
#include
#include
void main()
{
FILE *fp;
int b,a=100;
if((fp=fopen("3.c","w+"))==NULL)
{
printf("open is failed!\n");
exit(0);
}
if(fwrite(&a,sizeof(int),1,fp)!=1)
{
printf("fwrite is failed!\n");
exit(0);
}
rewind(fp); //让指针重置到文件的开头
//用fread从文件3.c中读出数据赋给b
if(fread(&b,sizeof(int),1,fp)!=1)
{
printf("fread is failed!\n");
exit(0);
}
printf("b=%d\n",b);
fclose(fp);
fp=NULL;
}
练习:从键盘输入4个学生的个人信息,然后转存到磁盘中去,又读出来。
#include
#include
void main()
{
int i;
FILE *fp;
struct student
{
char name[20];
int age;
};
struct student stu1[4],stu2[4];
for(i=0;i<4;i++)
scanf("%s %d",stu1[i].name,&stu1[i].age);
if((fp=fopen("xxx.c","w+"))==NULL)
{
printf("open is failed!\n");
exit(0);
}
for(i=0;i<4;i++)
{
if(fwrite(&stu1[i],sizeof(struct student),1,fp)!=1)
{
printf("写错了!\n");
}
}
rewind(fp);//把文件的指针重置到文件开头
for(i=0;i<4;i++)
{
if(fread(&stu2[i],sizeof(struct student),1,fp)!=1)
{
printf("读错了!\n");
}
}
for(i=0;i<4;i++)
{
printf("%s %d\n",stu2[i].name,stu2[i].age);
}
fclose(fp);
fp=NULL;
}
网友评论