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

标签 c file-io network-programming fopen

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

最佳答案

您问题的真正答案是您不能。 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] 可用。

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

关于c - 如何打开与程序位于同一目录中的 c 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14973668/

相关文章:

c - 从双链表中删除

c - 二维数组的排序

c - C 中的四舍五入 float

mysql - 将sql查询的结果写入mysql中的文件

c - 如何使用套接字 api 发送和接收字节?

在 Internet 域中为端口 0 发送数据报的正确命令

c++ - 如何在 C++ 中启用共享打开的文件?

android - 删除文件(包括内容清理)

c++ - Boost ASIO 缓冲不工作

python - twisted.protocols.basic.LineReceiver 和 twisted.internet.protocol.Protocol 有什么区别?