【问题标题】:Place of output text file输出文本文件的位置
【发布时间】:2012-10-18 03:00:18
【问题描述】:

我有一个奇怪的问题需要帮助。我制作了一个 C++ 程序,它从 .txt 文件中获取一些数据并将一些数据写入另一个 .txt 文件。当我通过 Xcode 编译和运行程序时,它会将输出文件与程序文件放在同一目录中——这正是我所需要的。但是当我关闭 Xcode 并通过双击运行程序时,它会在我的用户目录中创建一个输出文件。有没有办法解决这个问题?

【问题讨论】:

    标签: c++ xcode file output


    【解决方案1】:

    我不确定我是否完全理解了这个问题 - 但我认为您只需要为输出文件提供完整的文件名(包括路径)。

    【讨论】:

      【解决方案2】:

      当您根据文件名或通过相对路径打开文件时,该文件将相对于您当前的工作目录打开或创建。似乎当您从 XCode 运行时,工作目录设置为创建二进制文件的目录,而 Finder 在启动新进程时将当前工作目录设置为您的主目录。

      您可以指定绝对路径(以斜杠开头)或通过组合getcwd() 的结果和argv[0] 中指定的路径来计算二进制文件的位置。 argv[0] 包含您的二进制文件相对于当前工作目录的位置,因此可用于将二进制文件的位置计算为绝对路径。

      【讨论】:

        【解决方案3】:

        您可以使用argv[0] 检索程序的完整路径。

        然后,chdir 到该路径,或者使用从第一个路径构建的完整路径打开目标文件。

        例如:

        char path_buffer[512];
        
        strncpy(path_buffer, argv[0], 512); // This might be /home/user/Desktop/binary.exe
        
        chdir(dirname(path_buffer));    // This is now /home/user/Desktop
        
        fp = fopen("myfile.txt", "w");
        

        “盲目”chdir 进入任何dirname 返回的内容是安全的,因为dirname 将返回“。” (当前目录)以防出错。

        也可以:

        char path_buffer[512];
        char new_buffer[512];
        
        strncpy(path_buffer, argv[0], 512); // This might be /home/user/Desktop/binary.exe
        
        snprintf(new_buffer, 512, "%s/%s", dirname(path_buffer), "myfile.txt");
        fp = fopen(new_buffer, "w");
        

        上面会将new_buffer 设置为可执行文件同一目录中名为myfile.txt 的文件的完整路径名。我们需要两个缓冲区,因为dirname 可能会返回一个指向静态存储的指针,并且将“myfile.txt”直接附加到返回的字符串指针是不安全的,因为它相信它是path_buffer 的修改版本。

        可以编辑path_buffer,而无需使用dirname。这会导致可移植性问题,因为目录分隔符不一定是“/”;它可能是“\”。

        char path_buffer[512];
        char *p, *q;
        strncpy(path_buffer, argv[0], 512);
        for (p = q = path_buffer; *p; p++)
            if (('/' == *p) || ('\\' == *p))
                q = p+1;
        strncpy(q, "myfile.txt", 512 - (q - path_buffer));
        // You may now use path_buffer as file name:
        fp = fopen(path_buffer, "w");
        

        【讨论】:

        • 我添加了这些行:chdir(argv[0]); ofstream out ("Summary.txt");但它没有帮助 - 文件 Summary.txt 仍然出现在用户文件夹中
        • chdir(argv[0]) 总是会失败,因为 argv[0] 是二进制文件的路径而不是目录的路径,您需要先去除文件名部分。
        • 更新了答案以更好地解释我的意图。
        • 非常感谢,效果很好!但是函数 strncpy 必须如下所示:strncpy(path_buffer, argv[0], 512),首先到达目的地,然后是要复制的 C 字符串,然后是要复制的最大字符数。顺便说一句,为什么不只使用 strcpy?
        • 感谢您的通知,我把函数原型弄混了。最好使用“n”个函数(sNprintf、strNcpy),因为这样可以确保不会在太小的缓冲区中写入太多内容……“这样会很糟糕”。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多