双击编译的 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 可执行文件未打开现有文件以从中读取信息的主要内容,如果未能解决你的问题,请参考以下文章