如何在c中打开与程序位于同一目录中的文件?

时间:2013-02-20 06:34:58

标签: c file-io network-programming fopen

大家好我正试图从我为网络编程类编写的服务器程序中打开一个文件,发送到我的客户端程序。我尝试过使用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。

2 个答案:

答案 0 :(得分:1)

你问题的真正答案是你做不到。 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调用为openrelative(argv[0], "msg.txt")。或者从其他地方,但你需要以某种方式提供argv[0]

但是,由于无法保证这些方法有效,因此您不应该使用它们。特别是如果您的程序应该是便携式或其他人使用的话。

答案 1 :(得分:0)

来自您在代码中的评论:

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

变量cwd可能是~。如果是这样,那么当FatalError提到时,fopen()将不会为您展开它。在我使用的系统上,只有shell才能这样做。

解决方法就是例如致电getenv("HOME"),然后自己展开~