在solaris上的C开放

Mik*_*ike 1 c solaris file

我一直试图让这段代码工作几个小时!我需要做的就是打开一个文件,看看它是否真实可读.我是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
}
Run Code Online (Sandbox Code Playgroud)

我还验证了该路径正确指定了我已读取权限的实际文件.还有其他想法吗?

编辑1:我知道fpath最终为"~cs4352/projects/proj0/test/file.this"

编辑2:我也尝试过使用绝对文件路径.在这两种情况下,我都可以通过ls验证路径是否正确构建.

编辑3:errno2 ...我正在尝试跟踪谷歌的含义.

编辑4: 好的,errno2是"没有这样的文件或目录".当fopen中的参考路径是"/home/courses1/cs4352/projects/proj0/index.html"时,我得到了这个,我验证了它确实存在并且我已经阅读了它的权利.至于下面列出的C代码,可能会有一些语义/新手错误,但是gcc没有给我任何编译时警告,代码完全按照它应该工作,除了它说它继续吐出errno2.换句话说,我知道所有的strings/char数组都正常工作,但唯一可能是问题的是fopen()调用.

解决方案: 好的,access()过程对我的帮助最大(我还在使用它,因为代码更少,更不用说更优雅的方式了).这个问题实际上来自于我没有向你解释的事情(因为直到我使用access()才看到它).为了驱逐文件,我使用strtok()拆分字符串,只是拆分"\n",但因为这是一个UNIX系统,我还需要添加"\ r".一旦我修复了它,一切都落到了位置,我确信fopen()函数也能正常工作,但我还没有测试过.

谢谢大家的有用建议,尤其是Paul Beckingham找到这个美妙的解决方案.

干杯!

Pau*_*ham 6

  1. "〜"由shell扩展,不会被fopen扩展.
  2. 要测试文件的存在性和可读性,请考虑使用POSIX.1"访问"功能:
#include <unistd.h>

if (access ("/path/to/file", F_OK | R_OK) == 0)
{
  // file exists and is readable
}


sth*_*sth 5

首先,file需要声明为,char*或者const char*不仅仅是char你所写的.但这可能只是一个错字,编译器至少应该在那里发出警告.

其次,使用绝对路径(或相对于当前目录的路径),而不是shell语法~.~cs4352相应主目录的替换通常由shell完成,但您直接打开该文件.所以你试图在~cs4352当前工作目录的子目录中打开一个文件,我想这不是你想要的.