几个小时以来,我一直在努力让这段代码正常工作!我需要做的就是打开一个文件,看看它是否真实可读。我是 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: 好的,2 的 errno
是“没有这样的文件或目录”。当 fopen 中的引用路径是“/home/courses1/cs4352/projects/proj0/index.html”时,我得到了这个,我验证它确实存在并且我有阅读权限。至于下面列出的 C 代码,其中可能有一些语义/新手错误,但是 gcc 没有给我任何编译时警告,并且代码完全按照它应该的方式工作,只是它说它一直在吐 errno
为 2。换句话说,我知道所有字符串/字符数组都正常工作,但唯一可能出现问题的是 fopen()
调用。
解决方案: 好的,access() 过程对我帮助最大(我仍在使用它,因为它代码更少,更不用说更优雅的实现方式了)。问题实际上来自于我没有向大家解释的事情(因为直到我使用 access() 才看到它)。为了导出文件,我使用 strtok() 拆分字符串并且只拆分“\n”,但因为这是一个 UNIX 系统,我还需要向它添加“\r”。修复该问题后,一切就绪,我确信 fopen() 函数也能正常工作,但我尚未对其进行测试。
感谢大家提供的有用建议,特别是感谢 Paul Beckingham 找到了这个绝妙的解决方案。
干杯!
最佳答案
- "~"由 shell 扩展,不由 fopen 扩展。
- 要测试文件的存在性和可读性,请考虑使用 POSIX.1“访问”函数:
#include <unistd.h> if (access ("/path/to/file", F_OK | R_OK) == 0) { // file exists and is readable }
关于c - solaris 上的 C 中的 fopen,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/523084/