C语言可以做到使用文件的多种方式,例如打开一个用于读取的文本文件,创建一个用于写入的文本文件,附加一个文本文件等等。现在我们讨论一下关于使用C语言打开文件错误的情景。

   fopen函数用来打开一个文件,其有固定的调用形式:文件指针名=fopen(文件名,"r"),我们这里讨论打开所以是"r",如有其他操作则给fopen传入相应的使用文件方式,例如附加一个文本是"rb"。文件名必须被声明为FILE类型的指针变量。 

   例如我现在要打开一个文本,我在E//KanKan目录下创建一个日记本文档,将其命名为wode,日记本文档的后缀是.jnt。现在我们可以在编译器底下写入相应的代码来打开这个日记本文档。

   现在我先让FILE指针变量指向一个test.c文件,注意,现在肯定会打开失败,应为E目录下根本不存在test.c文件

代码演示:

{

FILE *p;

p = fopen("E:\\KanKan\\test.c", "r");

if (p == NULL)

{

printf("open file error\n");

}

else

{

printf("open file success\n");

}

system("pause");

return 0;

}

结果:

wKiom1ZuqQaTFHtLAAAWnaPfnpo812.png





现在我们将代码略微修改为:

{

FILE *p;

p = fopen("E:\\KanKan\\wode.jnt", "r");

if (p == NULL)

{

printf("open file error\n");

}

else

{

printf("open file success\n");

}

system("pause");

return 0;

}

结果:

wKioL1ZuqcWTiJ7CAAAbrxOKI1g923.png

   同时我们要注意一个计算机的小知识带点,计算机的组织里有一些关于文本的一些设置,一般的计算机在默认状态就具有某些特定文件的后缀,比如说我在上面测试所创建的文件名为wode的文件,计算机默认的已经在wode后面添加了.jnt,如果不小心将文本创建为wode.jnt,现在我们在open函数里依然传入wode.jnt肯定会编译失败。

  同时在我们编译器为我们打开文件分装了一个专门的库函数strerror,如果打开文件失败我们可以在printf函数里实现对strerror函数进行链式访问,可以自定分析出文件是因为什么原因而打开失败

代码演示:


FILE *p;

p = fopen("E:\\KanKan\\wode.jnt", "r");

if (p == NULL)

{

printf("open file error\n");

printf("error: %s\n", strerror(errno));

}

else

{

printf("open file success\n");

}

system("pause");

return 0;

}

使用strerror函数头文件是errno.h

结果:

wKiom1ZurZbTBGO7AAAb078XZo4549.png

strerror函数可以接受不同的int数字,不同数字代表不同文件打开的错误

例如:printf("error: %s\n", strerror(4));

结果:

wKiom1ZurlrBCKz9AAAbvrlzWlU376.png