c - solaris 上的 C 中的 fopen

标签 c file solaris

几个小时以来,我一直在努力让这段代码正常工作!我需要做的就是打开一个文件,看看它是否真实可读。我是 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 找到了这个绝妙的解决方案。

干杯!

最佳答案

  1. "~"由 shell 扩展,不由 fopen 扩展。
  2. 要测试文件的存在性和可读性,请考虑使用 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/

相关文章:

C 在函数中初始化一个字符数组,或者我应该将它作为参数传递

c - 具有大量输入文件的 C 程序的最佳实践

file - FrameBuffer 到 libgdx 或 OpenGL 内的文件

java - 使用 Java 中的有限库创建 Excel 文件

bash - 改进此 bash 脚本以模拟 "tail --follow"

c - Visual Studio : structures: error C2440

c - 将字符串格式化为 C 中的列

java - 为什么这段代码会跳过文件的第一行?

solaris - 在 Solaris 网络库中进行 autoconf 链接的规范方法是什么?

printing - 使用 Ghostscript 将 PCL 转换为 PostScript