/**
* fclose()
*原型:int fclose(FILE*f);
返回值:对于输出流,fclose函数会在文件关闭前刷新缓冲区,
如果它执行成功,fclose返回零值
注意:使用fclose函数就可以把缓冲区内最后剩余的数据输出到内核缓冲区,并释放文件指针和有关的缓冲区
两次fopen之间 必须先关闭? 这一点与PHP类似
*/
#include <stdio.h>
//P295 李春宝C语言
int main9_2_20(){
FILE *fp;
int i=20,j=30,k,n;
fp = fopen("d1.dat","w");//w 指定文件不存在--》建立新文件 指定文件存在--》原有内容丢失
fprintf(fp,"%d\n",i);
fprintf(fp,"%d\n",j);
fclose(fp);//自己:放在这里? 移动到最后一行 放到最后输出 0 0 rewind(fp); 也不行???
fopen("d1.dat","r");
fscanf(fp,"%d%d",&k,&n);
printf("%d %d\n",k,n);//20 30
fclose(fp);
return 0;
}
//AC 内涵换行符也行 【重要】P297 将一个名为old.dat的【文件复制】到一个名为new.dat的新文件中。
int main002(){
int c;
FILE *fp1,*fp2;
fp1 = fopen("old.txt","r");
fp2 = fopen("new.dat","w"); //不能写大写的W
c = getc(fp1);
while(c!=EOF){
putc(c,fp2);
c = getc(fp1);
}
fclose(fp1);
fclose(fp2);
return 0;
}
//-->两个文件名在命令行中给出
//在Clion的IDE中指定命令行参数 todo 暂略
int main0021(int argc,char *argv[]){
if(argc<3){
printf("Parameters missing!\n");
return 0;
}
int c;
FILE *fp1,*fp2;
if((fp1=fopen(argv[1],"r"))==NULL || (fp2=fopen(argv[2],"w"))==NULL){
printf("cannot open file!\n");
return 0;
}
while(!feof(fp1)){ //&nbs***bsp; feof(fp1)==0
fputc(fgetc(fp1),fp2); // 上题 getc putc 暂略 f---function
}
fclose(fp1);
fclose(fp2);
return 0;
}
//P298 统计文本文件中的字符行数
int main003(){
FILE *fp;
int num = 0;
char buff[80];
if((fp=fopen("old.txt","r"))==NULL){
printf("不能打开文件\n");
return 0;
}
while(!feof(fp)){
fgets(buff,80,fp);
num++;
}
printf("num=%d\n",num);//自己:当每行字符太大时 结果不对 todo 如何调整
fclose(fp);
return 0;
}
//AC P300 从磁盘中输入一个字符串,把该字符串中的小写字母转换为大写字母,输出文件到test.dat中,然后从该文件读出字符串并显示出来。
void main9_2_32(){
FILE *fp;
char str[100];
int i = 0;
if((fp=fopen("test.dat","w"))==NULL){
printf("不能打开文件\n");
return;
}
printf("input a string:\n");
gets(str);
while(str[i]){
if(str[i]>='a' && str[i]<= 'z'){
str[i] = str[i] - 'a' + 'A';//str[i]-32 &nbs***bsp; str[i] - ('a' - 'A')
}
fputc(str[i],fp);
i++;
}
fclose(fp);
fp = fopen("test.dat","r");
fgets(str,100,fp);
printf("%s\n",str);
fclose(fp);
}