3

大家好,我正在尝试从我为网络编程类编写的服务器程序打开一个文件,以发送到我的客户端程序。我试过使用 fopen,

  strcat(cwd, msg);              //i append the directory to the filename
  printf("%s\n", cwd);

  if(n>0){
     req = fopen(msg, "r");      //fopen(~\\blah\\blah\\blah\\msg)

msg 是 txt 文件的名称。

我希望在 c 中完成此操作。

有任何想法吗?非常感激。

想补充一点,即使打印出来的目录是正确的,req 也变成了 null。

4

2 回答 2

2

你的问题的真正答案是你不能。C 无法让您知道构建程序映像的文件所在的位置,部分原因是它没有假设它甚至是从文件构建的。因此,没有通用的、可移植的方式可以保证工作。

但是,在某些环境和某些条件下,您可以使用argv[0],它可能包含找到程序文件的路径。在 Unix/Linux 下经常出现这种情况(但不一定——你要感谢启动你的程序的程序)。我不知道它在 Windows 等其他系统上的情况如何。

如果您想使用该方法,可以执行以下操作:

FILE *openrelative(char *base, char *name)
{
    char *buf1, *dir, *buf2;
    int len;
    FILE *ret;

    buf1 = strdup(base); /* dirname might modify its argument, so copy base. */
    dir = dirname(buf1);
    len = strlen(dir) + 1 + strlen(name) + 1;
    buf2 = malloc(len);
    snprintf(buf2, len, "%s/%s", dir, name);
    ret = fopen(buf2, "r");
    free(buf2); free(buf1);
    return(ret);
}

main然后,从as调用此函数openrelative(argv[0], "msg.txt")。或者从其他地方,但你需要以argv[0]某种方式提供。

但是,由于不能保证这些方法有效,因此您不应该真正使用它们。如果您的程序应该是可移植的或被其他人使用,则尤其如此。

于 2013-02-20T07:36:46.447 回答
0

根据您在代码中的评论:

// fopen(~\\blah\\blah\\blah\\msg)

变量cwd可能是~. 如果是这样,那么正如 FatalError 所提到的,fopen()不会为您扩展它。在我使用过的系统上,只有 shell 会这样做。

解决方法是例如调用getenv("HOME"),然后扩展~自己。

于 2013-02-21T15:58:09.953 回答