12/14
文件:源文件,目标文件,可执行文件,头文件。
文件通常驻留在磁盘上。
普通文件:
设备文件:os通过操作设备文件就可以对外设操作
文本文件:以ASCII码的格式存放。
二进制文件:无需转换。
文件系统:
缓存功能:所有的数据都要通过缓存的功能。内存区
外围设备可以看做一个文件接受变量一次性读多少
缓存的好处减少和磁盘的交互。提高读写的效率。
非缓存系统:程序和文件交换
程序中可以设定缓存。不是系统自动设置的,需要用户自己根据自己需要自己设定的
把缓冲文件的输入输出称为标准输入输出()标准IO
非缓冲文件系统的输入输出称为系统输入输出(系统IO)
文件流:对缓冲中的数据进行操作。流:源-》目的地。特殊的数据。
输入流(从文件输入到内存)和输出流(从内存输出到文件)
文本流 字符序列
二进制流 二进制序列
三个标准流:stdin(0表示)
stdout(1表示)
stderr(2表示)
文件结构体FILE和文件指针:
文件信息区:<系统程序设计>
typedef struct
{
short level;
unsigned flagd;
char fd;
unsigned char hold;
short bzise;
unsigned char *buffer;
unsigned char *curp;
unsigned istemp;
short token;
}FILE;
当前文件信息描述。
文件指针:FILE *指针变量(结构体指针)
stdin FEIL类型的结构体指针(流指针)(文件指针)
通过文件指针操作获得相关信息。
一个指向文件的指针。用户通过指针获得文件信息并访问文件
文件打开:
FILE *fopen(char *filename, char *mode);
功能:按指定方式打开文件
事例:
FILE *fP;
fp=fopen(“text.txt”,“w”) :以写的方式打开
“rt” "r"只读方式
“wt”"w"打开方式
“at”追加
“wb”以二进制打开二进制文件
a 最加
+读写操作
“r+”读写
“w+"覆盖原有文件
文件关闭:
int flose(FILE *fp);
刷新缓存 fclose
int ftell(FILE *fp);
文件内部有文件指针。
返回的是字节数。
FILE *fp;
fp=fopen(“text.txt”,“w”)
float pos=ftell(fp);
#include
#include
int main()
{//打开输入流 文件指针fp就和文件关联起来
FILE *fp;
fp=fopen(“D:ss.txt”,“r”);
if(fp==NULL)
{
printf(“open file error\n”);
exit(EXIT_FAILURE);
}
int pos = ftell(fp);//返回位置指针的字节数
printf(“pos:%d”,pos);
if(fclose(fp)!=0)//释放资源 刷新缓存
{
printf(“close file error\n”);
exit(EXIT_FAILURE);
}
}
字符读写:
getchar 和 putchar函数
读取一个字符
标准输入输出
fgetc和 fputc
int fgetc(FILE *fp)
从fp指向的文件读取一个字符
int fputc(int ch,FILE *fp)
把一个字符ch写入fp指向的文件中
看原型 man 函数名
#include
int main()
{
int ch;
while((ch=getchar())!="\n")//curp指针指向缓冲中的内容
{
putchar(ch);//putchar输出到缓存中 缓存到屏幕
//malloc calloc realloc 申请一个缓存‘系统程序设计’
//标准的输入输出函数都有一块缓存
//
}
putchar(ch);
int ch;
while((ch=getc(stdin))!='\n')
{
putc(ch,stdout);
}
putc(ch,stdout);
int ch;
ch = getchar();
putchar(ch);
//ungetc(ch,stdin);
ch=getchar();
putchar(ch);
putchar(ch);
putchar(ch);
putchar(ch);
putchar(ch);
return 0;
}
//文件拷贝
#include
#include
int main()
{
FILE *spIN ,*spOUT;
spIN=fopen(“d:ss.txt”,“r”);
if(spIN==NULL)
{
printf(“open error”);
exit(EXIT_FAILURE);
}
spOUT=fopen("d:s1.txt","w");
if(spOUT==NULL)
{
printf("open error");
exit(EXIT_FAILURE);
}
int ch;
while((ch=fgetc(spIN))!=EOF)
{
fputc(ch,spOUT);
}
if(fclose(spIN)!=0)
{
printf("open error");
exit(EXIT_FAILURE);
}
if(fclose(spOUT)!=0)
{
printf("open error");
exit(EXIT_FAILURE);
}
}
//统计文件大小
#include
#include
int main(int argc,char *argv[])//带参主函数
{
if(argc!=2)
{
printf("usage:%s filepath\n",argv[0]);
exit(1);
}
FILE *sp;
int lines=0;
int chars=0;
sp=fopen(argv[1],"r");//命令行 0是可执行文件
if(sp==NULL)
{
printf("open file error");
exit(1);
}
int ch;
while((ch=fgetc(sp))!=EOF)//判断是否结束
{
chars++;
if(ch=='\n')//换行
lines++;
}
fclose(sp);
printf("%d--%d",chars,lines);
}
//统计单词的个数
#include
#include
#define WHITE_SPACE
(ch==’ ‘||ch==’\t’||ch==’\n’)
int main(int argc,char *argv[])
{
if(argc!=2)
{
printf(“usage:%s file\n”,argv[0]);
exit(1);
}
FILE *fp=NULL;
fp=fopen("d:ss.txt","r");
if(fp==NULL)
{
printf("open file error\n");
exit(1);
}
int words=0;
int ch;
while((ch==fgetc(fp))!=EOF)
{
if(WHITE_SPACE)
words++;
}
fclose(fp);
printf("total of word:%d",words);
}
//合并文件 并排列 文件位置 fseek 文件位置指针
#include
#include
void sort(char conten[],int n)
{
for(int i=0;i
}
int main(int argc, char *argv[])
{
if(argc!=4)
{
printf(“usage:%s file_a file_b file_c\n”,argv[0]);
exit(1);
}
FILE *fp1;
fp1=fopen(argv[1],"r");
if(fp1==NULL)
{
printf("open fp1 error");
exit(1);
}
FILE *fp2;
fp2=fopen(argv[2],"r");
if(fp2==NULL)
{
printf("open fp1 error");
exit(1);
}
FILE *fp3;
fp3=fopen(argv[3],"w");
if(fp3==NULL)
{
printf("open fp1 error");
exit(1);
}
char conten[100];
int i=0;
char ch;
while((ch=fgetc(fp1))!=EOF)
{
putchar(ch);
if(ch == ' '||ch == '\t'||ch == '\n')
{
continue;
}
conten[i++]=ch;
}
fclose(fp1);
while((ch=fgetc(fp2))!=EOF)
{
putchar(ch);
if(ch==' '||ch=='\t'||ch=='\n')
{
continue;
}
conten[i++]=ch;
}
fclose(fp2);
int n=i;
sort(conten,n);
for(i=0;i
}
fgets fputs
char *fgets(char *str,int size,FILE *FP) 返回str 指针
int fputs(char *str , FILE *fp) 成功返回 0 失败返回EOF
#include
#include
int main(int agrc,char *agrv[])
{ if(agrc!=3)
{
printf(“usage:%s\n”,agrv[0]);
exit(0);
}
FILE *fp1,*fp2;
fp1=fopen(agrv[1],"r");
if(fp1==NULL)
{ printf("error");
exit(1);
}
fp2=fopen(agrv[2],"w");
if(fp2==NULL)
{ printf("error");
exit(1);
}
char contens[100]={'\0'};
while(fgets(contens,sizeof(contens),fp1)!=NULL)
{ //fgets(str,sizeof(str),stdin)从键盘
fputs(contens,fp2);
//fputs(str,stdout)输出到屏幕
}
fclose(fp1);
fclose(fp2);
}
atoi函数 字符串转换成整形
//scanf遇见空格停止
sscanf aprintf
int sscanf(char const *str,char const *format,…)
int sprintf(char const *str,char const *format,…)
#include
#include
int main()
{
char *str=“hello world 2012”;
char str1[10]={’\0’};
char str2[10]={’\0’};
int year=0;
char str3[50]={’\0’};
sscanf(str,"%s %s %d",str1,str2,&year);
sprintf(str3,"%s %s %d",str1,str2,year);
printf("str3:%s",str3);
char nums[20];
int num=12345;
sprintf(nums, "%d", num);
printf("%s\n",nums);
}
fscanf() fprintf()
int fscanf(FILE *fp,const char *format,…)
int fprintf(FILE *fp,const char *format,…)
输出等级
#include
#include
char get_grad(float average);
int main()
{
int xh;
char name[20]={'\0'};
int score1,score2,score3;
char grade;
float average;
FILE *fp1;
fp1=fopen("d:ne.txt","r");
if(fp1==NULL)
{
printf("open error");
exit(EXIT_FAILURE);
}
FILE *fp2;
fp2=fopen("d:z.txt","w");
if(fp2==NULL)
{
printf("open error");
exit(EXIT_FAILURE);
}
while(fscanf(fp1,"%d %s %d %d %d",&xh,name,&score1,&score2,&score3)!= EOF)
{
average=(score1+score2+score3)/3.0;
grade=get_grad(average);
fprintf(fp2,"%d %s %.2f %c\n",xh,name,average,grade);
}
fclose(fp1);
fclose(fp2);
return 0;
}
char get_grad(float average)
{
if(average>90)
return ‘A’;
else if(average>80)
return ‘B’;
else if(average>70)
return ‘C’;
else if(average>60)
return ‘E’;
else
return ‘F’;
}
fread() fwrite()
int fread(void *buffer,int num_bytes,int count,FILE *FP);
int fwrite(void *buffer,int num_bytes,int count,FILE *FP);
buffer 指向要进行输入输出的数据存储区的通用指针
num_bytes 元素的字节数
count 元素的个数
fp 读写的文件指针
#include
#include
void bin_to_text(char *argv[]);
void text_to_bin(char *argv[]);
typedef struct
{
int xh;
char name[20];
int age;
}Student;
int main(int argc,char *argv[])
{
if(argc!=4)
{
printf(“usage:%s source target1 target2”,argv[0]);
exit(EXIT_FAILURE);
}
text_to_bin(argv);
bin_to_text(argv);
return 0;
}
void bin_to_text(char *argv[])
{ Student stu;
FILE *fp1,*fp2;
fp1=fopen(argv[1],“r”);
if(fp1==NULL)
{
printf(“open error”);
exit(EXIT_FAILURE);
}
fp2=fopen(argv[2],“wb”);
if(fp2==NULL)
{
printf(“open error”);
exit(EXIT_FAILURE);
}
while(fscanf(fp1,"%d %s %d",&stu.xh,stu.name,&stu.age)!=EOF)
{
fwrite(&stu,sizeof(stu),1,fp2);
}
fclose(fp1);
fclose(fp2);
}
void text_to_bin(char *argv[])
{ Student stu;
FILE *fp1,*fp2;
fp1=fopen(argv[2],“rb”);
if(fp1==NULL)
{
printf(“open error”);
exit(EXIT_FAILURE);
}
fp2=fopen(argv[3],“w”);
if(fp2==NULL)
{
printf(“open error”);
exit(EXIT_FAILURE);
}
while(fread(&stu,sizeof(stu),1,fp1))
{
fprintf(fp2,"%d %s %d",stu.xh,stu.name,stu.age);
}
fclose(fp1);
fclose(fp2);
}
文件定位
随机读写按照要求移动文件位置指针
void fseek(FILE *fp,long offset,int whence);
成功返回0 失败返回-1
offset 位移量
SEEK_SET 文件首 0
SEEK_CUR 文件当前位置 1
SEEK_END 文件尾 2
#include
#include
typedef struct
{
int xh;
char name[20];
int age;
}Student;
int main(int argc,char *argv[])
{
if(argc!=3)
{
printf(“usage:%s”,argv[0]);
exit(1);
}
Student stu;
FILE *fp1,*fp2;
fp1=fopen(argv[1],"rb");
if(fp1==NULL)
{
perror(argv[1]);
exit(1);
}
fp2=fopen(argv[2],"w");
if(fp2==NULL)
{
perror(argv[2]);
exit(1);
}
int i;
for(i=0;i<3;i++)
{
fseek(fp1,i*sizeof(stu),SEEK_SET);
fread(&stu,sizeof(stu),1,fp1);
fprintf(fp2,"%d %s %d",stu.xh,stu.name,stu.age);
}
fclose(fp1);
fclose(fp2);
return 0;//编译 gcc -o bin/fseek src/fseek.
//运行 bin/fseek
}
void rewind(FEIL *fp)
int remove(const char *filename)
void fflush(FILE *fp)