1.关与remove
remove用法:remove(“文件名”);
作用:删除某文件
注意:用这个函数时一定要先关闭文件,再删除,否则就会删除失败。
例如:先删除文件再关闭文件就会删除失败
FILE *fp;
if((fp=fopen("文件5","ab"))==NULL)
{
exit(0);
}
remove("文件5"); //先删除
fclose(fp); //后关闭
运行后:文件仍然存在,删除失败
先关闭文件再删除才能删除成功
FILE *fp;
if((fp=fopen("文件5","ab"))==NULL)
{
exit(0);
}
fclose(fp); //先关闭
remove("文件5"); //后删除
运行后:删除成功
2:关于rename
rename用法:rename(“原文件名”,“新文件名”);
作用:修改某文件的名称
注意:这个和remove类似,都要先关闭文件,再删除。
例如:先改名后关闭文件
FILE *fp;
if((fp=fopen("文件5","ab"))==NULL)
{
exit(0);
}
rename("文件5","文件567");//先改名
fclose(fp); //后关闭文件
运行后:文件改名失败
如果先关闭文件再改名
FILE *fp;
if((fp=fopen("文件5","ab"))==NULL)
{
exit(0);
}
fclose(fp); //先关闭文件
rename("文件5","文件567");//后改名
运行后:改名成功
在调用函数时,如果被调用函数里面用到了remove和rename,一定要在调用函数前关闭文件,否则操作就会失败,因为这个错误不明显,不是很好找,之前有一次我找了半天才知道是这个问题,在这提醒大家一下。
例如:
void handle()
{
FILE *fq;
if((fq=fopen("文件5","ab"))==NULL)
{
exit(0);
}
fclose(fq);//先关闭文件
remove("文件5");//再删除文件
}
int main()
{
FILE *fp;
if((fp=fopen("文件5","ab"))==NULL)
{
exit(0);
}
handle();//先调用函数,在调用函数前没有关闭文件
fclose(fp);
return 0;
}
大家注意:handle函数这段代码看似正确,但因为我们在main函数中并没有在调用handle函数前关闭文件,所以最中会导致删除失败。结果如下:
文件仍然存在,删除失败。
也就是说,指向同一个文件的指针可以有多个,但只要有一个指针还指向这个文件,那么该文件用remove函数删除就会删除失败。上面这个例子就是因为在调用handle函数前没有关闭文件,所以在handle函数里面即使执行了fclose(fq)这一语句,但在main函数中的fp还是指向该文件。也就是说还有指针指向待删除的文件。最终导致删除失败。
我们只要将main函数中的handle()和fclose(fp)交换下位置就可以了。我们看代码:
void handle()
{
FILE *fq;
if((fq=fopen("文件5","ab"))==NULL)
{
exit(0);
}
fclose(fq);//先关闭文件
remove("文件5");//再删除文件
}
int main()
{
FILE *fp;
if((fp=fopen("文件5","ab"))==NULL)
{
exit(0);
}
fclose(fp);//先关闭文件
handle();//后调用函数
return 0;
}
运行后:
文件删除成功。
*
3.还是在调用函数前不关闭文件的一些问题
我们看下面这段代码:
void handle()
{
FILE *fq;
char b[5];
if((fq=fopen("文件5","rb"))==NULL)
{
exit(0);
}
fread(b,sizeof(b),1,fq);
puts(b);
fclose(fq);
}
int main()
{
FILE *fp;
char a[5]="1234";
if((fp=fopen("文件5","wb+"))==NULL)
{
exit(0);
}
fwrite(a,sizeof(a),1,fp);
handle();
fclose(fp);
return 0;
}
运行结果如下
我们期待的结果应该是数组a的内容"1234",但最终显示的却是乱码。
这是因为虽然我们在main函数中将数组a的内容存到文件中,但此时我们没有关闭文件,数组a的内容并没有正真传到文件中,它还在缓冲区内。所有我们在执行handle函数时数组b获取的并不是数组a的内容(文件之前没有任何内容)
所以我们还是得在执行handle前关闭文件,让在缓冲区中的内容到文件中去,也就是交换下面这两行代码的顺序。
handle();
fclose(fp);
交换后的结果如下:
现在就正确了。
*
4.在用wb+,wa+,wr+这类既能读也能写的打开方式时,尽量不要同时用fread和fwrite。如下:
FILE *fp;
char a[5]="1234",b[5];
if((fp=fopen("文件5","ab+"))==NULL)
{
exit(0);
}
fread(b,sizeof(b),,fp);
fwrite(a,sizeof(a),1,fp);
flcose(fp);
我们想先从文件读取数据到数组b中,然后再将a中的内容写入文件。但这样我们并不能达到我们的目的,不信你可是试试。
但在fread和fwrite增加一些清空缓存区函数或者文件定位函数,就能同时读之后接着写。例如fseek,rewind。
fread(b,sizeof(b),,fp);
fseek(fp,0,1);
fwrite(a,sizeof(a),1,fp);
这样就可以了。
这其中原因我也不清楚,只是在这里提醒大家一下。
·
·
希望能帮到大家!