2

我的桌面上有一个名为 fun 的文本文件,但是当我通过时:

FILE* fp;

if((fp = fopen("/Users/<username>/Desktop/fun", "r")) == NULL)
{
    printf("File didn't open\n");
    exit(1);
}

fp 为空。我也试过

/home/<username>/Desktop/fun

和许多变化,我似乎仍然无法获得正确的文件路径。我是使用文件和 C 的新手。任何帮助将不胜感激。

4

7 回答 7

6

fopen()无法扩展 shell 关键字。

改变

FILE* fp = fopen("~/Desktop/fun.txt", "r")

FILE* fp = fopen("/home/<yourusername>/Desktop/fun.txt", "r")

像这样的字符'~', '*'由 shell 解释并扩展。

于 2013-08-05T05:22:35.063 回答
4

您不能~在路径名中使用来表示用户的主目录。该符号被 shell 和其他一些应用程序识别,但它不是 Unix 文件系统接口的一部分。您需要拼出用户的实际主目录。

fopen("/home/username/Desktop/fun.txt", "r")
于 2013-08-05T05:23:59.693 回答
3

~路径中的可能是问题所在。是你的 shell 在命令行上扩展它。fopen不会调用 shell 在路径上进行替换,您需要自己执行此操作。

因此,将完整(相对或绝对)路径传递给fopen,而不是需要外壳扩展(~、通配模式或外壳变量)的东西。

于 2013-08-05T05:22:38.110 回答
3

您需要扩展~. 使用getenv("HOME").

getenvopengroup甚至提供了一些代码:

const char *name = "HOME";
char *value;
value = getenv(name);
于 2013-08-05T05:23:10.993 回答
0
/*===exphome===([o]i)==================================================
 * if SIn is not NULL then
 *    if SIn starts with '~'
 *    then expands $HOME, prepends it to the rest of SIn, and
 *         stores result in SOut or, if SOut==NULL, in a new
 *         allocated string and returns it
 *    else if SOut!=NULL
 *         then copies SIn into SOut and returns SOut
 *         else returns duplicated SIn
 * else returns NULL
=*===================================================================*/
    char *exphome(char *SOut, char *SIn)
    {char *Rt= NULL;
     char *envhome= NULL;

     if(SIn)
        if(*SIn=='~' && (envhome=getenv("HOME")))
          {Rt= malloc(strlen(SIn)+strlen(envhome)+1);
           strcpy(Rt, envhome); strcat(Rt, SIn+1);
           if(SOut) {strcpy(SOut, Rt); free(Rt); Rt= SOut;}
          }
        else if(SOut) {strcpy(SOut, SIn); Rt= SOut;}
        else Rt= strdup(SIn);

     return Rt;
    } /*exphome*/

接着

fopen(exphome(NULL, yourfile), ...)
于 2019-09-11T19:21:41.397 回答
-1

看起来答案提示了对原始问题的编辑。但是,正如目前所写的那样,文件名上没有扩展名?这是真的吗?还是文件以“*.txt”等结尾?

于 2013-08-05T19:38:09.220 回答
-1

仔细检查您是否拥有正确的完整文件路径。转到文件,右键单击它并选择“属性”。您输入的路径是否与显示的完全一致,包括任何后缀?即,如果文件名为“file.txt”,请确保在代码中包含“.txt”后缀。

于 2013-08-05T20:23:44.720 回答