文件IO

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)

你可能感兴趣的:(c/c++)