【发布时间】:2010-10-06 02:28:56
【问题描述】:
我一直试图让这段代码工作几个小时!我需要做的就是打开一个文件,看看它是否真实且可读。我是 C 的新手,所以我确定我缺少一些愚蠢的东西。这是代码(速记,但已复制):
#include <stdio.h>
main() {
char fpath[200];
char file = "/test/file.this";
sprintf(fpath,"~cs4352/projects/proj0%s",file);
FILE *fp = fopen(fpath,"r");
if(fp==NULL) {
printf("There is no file on the server");
exit(1);
}
fclose(fp);
//do more stuff
}
我还验证了路径是否正确指定了我具有读取权限的真实文件。还有其他想法吗?
编辑 1:我知道 fpath 以“~cs4352/projects/proj0/test/file.this”结尾
编辑 2: 我也尝试过使用绝对文件路径。在这两种情况下,我都可以通过 ls 验证路径是否正确构建。
编辑 3:errno 是 2...我目前正在尝试在 google 中跟踪这意味着什么。
编辑 4: 好的,errno of 2 是“没有这样的文件或目录”。当 fopen 中的参考路径是“/home/courses1/cs4352/projects/proj0/index.html”时,我得到了这个,我验证它确实存在并且我拥有它的阅读权限。至于下面列出的 C 代码,其中可能存在一些语义/新手错误,但 gcc 没有给我任何编译时警告,并且代码完全按照它应该的方式工作,只是它说它一直在吐errno 2. 换句话说,我知道所有的字符串/字符数组都可以正常工作,但唯一可能出现问题的是fopen() 调用。
解决方案: 好的,access() 过程对我帮助最大(我仍在使用它,因为它的代码更少,更不用说更优雅的方式了)。问题实际上来自于我没有向大家解释过的东西(因为直到我使用 access() 才看到它)。为了导出文件,我使用 strtok() 拆分字符串并且只在“\n”上拆分,但因为这是一个 UNIX 系统,我还需要在其中添加“\r”。一旦我解决了这个问题,一切就都到位了,我确信 fopen() 函数也能正常工作,但我还没有测试过。
感谢大家的有益建议,尤其感谢 Paul Beckingham 找到了这个绝妙的解决方案。
干杯!
【问题讨论】:
-
我真的认为操作系统实际上不理解“~cs4352”。用真实路径替换它。 ~cs4352 只是被外壳替换。但这里没有贝壳。但正如你所说,你也尝试过绝对路径。我想这是另一个问题
-
系统error.h应该有一个errno的列表。在 MacOS X 上,2 是“没有这样的文件或目录”。我喜欢乔和某某给出的答案。
-
只使用 perror 它以人类可读的形式显示错误,或者使用 strerror 来翻译 errno
-
@litb:你每天都会学到一些东西。谢谢。