双击编译的 C++ Unix 可执行文件未打开现有文件以从中读取信息

Posted

技术标签:

【中文标题】双击编译的 C++ Unix 可执行文件未打开现有文件以从中读取信息【英文标题】:Double Clicked Compiled C++ Unix Executable Doesn't Open Existing File to Read Information From 【发布时间】:2016-12-09 21:12:27 【问题描述】:

我一直在网上搜索以解决上述问题,没有 到目前为止的成功。我将在下面更详细地描述这个问题。

我的程序只包含一个 .cpp 文件。如果打开此文件,程序应显示“test.txt”中的文本。否则,它应该显示“无法打开...”消息。问题如下:

我打开终端,转到包含我的文件的目录,使用常用命令编译和运行:“g++ main.cpp”和“./a.out”。当我以这种方式运行程序时,直接使用终端,程序可以正常运行。文本文件存在时显示文本,不存在时输出错误。当我双击 unix 可执行文件“a.out”时,即使文本文件存在并且与可执行文件并排放置,程序仍会显示“无法打开...”消息。我不知道当时该怎么想。除了下面的内容之外,代码还应该包含其他内容吗?

操作系统:OS X 10.9.5

#include <iostream>
#include <fstream>
using namespace std;

const int MAX_CHAR_READ = 100;


int main(int argc, const char * argv[])

    ifstream read_file;
    cout << endl << endl;

    //Allocate dynamic memory
    char * file = new char[strlen("test.txt") + 1];
    char * text_line = new char[MAX_CHAR_READ + 1];

    strcpy(file, "test.txt");

    //Attempt to open a file for reading
    read_file.open(file);

    if(read_file.is_open() == true)
    
        cout << "File: " << file << " is open!" << endl;
        read_file.get(text_line, MAX_CHAR_READ, ';');
        cout << text_line << endl;
        read_file.close();
    
    else
        cout << "Failed to open: " << file << endl;

    cout << endl << endl;

    //Deallocate dynamic memory
    delete [] file;
    delete [] text_line;
    return 0;

手动使用终端的程序执行示例:

$ cd Desktop/Other/Test
$ g++ main.cpp
$ ./a.out

File: test.txt is open!
Hello World!

$

程序执行示例双击同一个可执行文件:

$/Users/vladimirmeshcheryakov/Desktop/Other/Test/a.out ; exit;

Failed to open: test.txt

logout

[Process completed]    

【问题讨论】:

程序的运行目录可能不是Test,因此找不到文件test.txt。 可执行文件从同一目录运行,只是方式不同:直接使用终端或双击。我对“运行目录”有误解吗? 双击的时候不清楚运行目录是什么。您可以通过打印运行目录并尝试使用其完整路径访问文件来检查。 好的,这似乎是您提到的工作目录问题。当我在上面的程序中编写附加代码以显示当前工作目录时,双击程序时的输出与通过终端运行时的输出不同。如果我将 test.txt 文件放在双击程序指向的位置(带有打印工作目录路径的附加代码),上述程序将打开 test.txt 文件并按预期工作。现在我需要找到一个获取可执行文件路径的解决方案。谢谢! 【参考方案1】:

其中一个可能的原因是终端以 超级用户 身份运行在一个对普通用户有访问限制的文件夹中。 (超级用户没有这个限制)

解决方案:授予当前用户对该文件夹的读/写权限。

【讨论】:

我尝试了您提供的解决方案,但无法解决问题!不过谢谢你的想法。【参考方案2】:

现在我需要找到一个获取可执行文件路径的解决方案。

检查argv[0]是否包含它。

【讨论】:

以上是关于双击编译的 C++ Unix 可执行文件未打开现有文件以从中读取信息的主要内容,如果未能解决你的问题,请参考以下文章

linux下如何运行可执行文件

编译旧的 C++ unix 应用程序以在 Windows 中使用

[ubuntu setting]双击运行程序或shell

zookeeper支持c++吗

C语言编译器,神奇的魔法师

C语言编译和链接详解(通俗易懂,深入本质)