天天看点

C语言文件处理所遇到的一些问题和解决方法

1.关与remove

remove用法:remove(“文件名”);

作用:删除某文件

注意:用这个函数时一定要先关闭文件,再删除,否则就会删除失败。

例如:先删除文件再关闭文件就会删除失败

FILE *fp;
    if((fp=fopen("文件5","ab"))==NULL)
    {
        exit(0);
    }
    remove("文件5");  //先删除
    fclose(fp);  //后关闭
           

运行后:文件仍然存在,删除失败

C语言文件处理所遇到的一些问题和解决方法

先关闭文件再删除才能删除成功

FILE *fp;
    if((fp=fopen("文件5","ab"))==NULL)
    {
        exit(0);
    }
    fclose(fp);  //先关闭
    remove("文件5");  //后删除
           

运行后:删除成功

C语言文件处理所遇到的一些问题和解决方法

2:关于rename

rename用法:rename(“原文件名”,“新文件名”);

作用:修改某文件的名称

注意:这个和remove类似,都要先关闭文件,再删除。

例如:先改名后关闭文件

FILE *fp;
    if((fp=fopen("文件5","ab"))==NULL)
    {
        exit(0);
    }
    rename("文件5","文件567");//先改名
    fclose(fp);   //后关闭文件
           

运行后:文件改名失败

C语言文件处理所遇到的一些问题和解决方法

如果先关闭文件再改名

FILE *fp;
    if((fp=fopen("文件5","ab"))==NULL)
    {
        exit(0);
    }
    fclose(fp);   //先关闭文件
    rename("文件5","文件567");//后改名
           

运行后:改名成功

C语言文件处理所遇到的一些问题和解决方法

在调用函数时,如果被调用函数里面用到了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函数前关闭文件,所以最中会导致删除失败。结果如下:

C语言文件处理所遇到的一些问题和解决方法

文件仍然存在,删除失败。

也就是说,指向同一个文件的指针可以有多个,但只要有一个指针还指向这个文件,那么该文件用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;
}
           

运行后:

C语言文件处理所遇到的一些问题和解决方法

文件删除成功。

*

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;
}
           

运行结果如下

C语言文件处理所遇到的一些问题和解决方法

我们期待的结果应该是数组a的内容"1234",但最终显示的却是乱码。

这是因为虽然我们在main函数中将数组a的内容存到文件中,但此时我们没有关闭文件,数组a的内容并没有正真传到文件中,它还在缓冲区内。所有我们在执行handle函数时数组b获取的并不是数组a的内容(文件之前没有任何内容)

所以我们还是得在执行handle前关闭文件,让在缓冲区中的内容到文件中去,也就是交换下面这两行代码的顺序。

handle();
fclose(fp);
           

交换后的结果如下:

C语言文件处理所遇到的一些问题和解决方法

现在就正确了。

*

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);
           

这样就可以了。

这其中原因我也不清楚,只是在这里提醒大家一下。

·

·

希望能帮到大家!