好的,这是我第一次在Xcode中编写C ++(我习惯于ObjC),而且我现在已经开始在我的大学开设编程课程了。
我正在尝试打开一个文件(硬编码或来自控制台中的用户输入),无论我尝试什么,它都说文件无法打开(通过错误检查)
我假设它是因为我所拥有的test.txt文件不在假定的根目录中,所以如果是这样的话,根目录是什么?
到目前为止,这是我的代码:
//include files
#include <iostream>
#include <stdio.h>
#include <fstream>
using namespace std;
//Global Variables
short inputPicture[512][512];
short outputPicture[512][512];
//Function Prototypes
void getInput(char* in, char* out);
void initializeArray(ifstream* input);
//Main
int main(){
//local variables
char inputFile[32];
char outputFile[32];
ifstream input;
ofstream output;
getInput(inputFile, outputFile);
cout << inputFile << endl;//test what was sent back from the function
input.open(inputFile, ifstream::in);
if (!input.is_open()){//check to see if the file exists
cout << "File not found!\n";
return 1;//if not found, end program
}
initializeArray(&input);
return 0;
}//end Main
//Gets initial input from user
void getInput(char* in, char* out){
cout << "Please designate input file: ";
cin >> in;
cout << "\nPlease designate an output file: ";
cin >> out;
}//end getInput
//Sets the global array to the information on the input file
void initializeArray(ifstream* input){
}//end initializeArray
如果我正在做其他事情,请告诉我,因为我确信这总是很有可能:)
答案 0 :(得分:18)
默认目录应该是相对应用程序的工作目录,该目录通常与应用程序所在的位置相同(有时调试器可能会混乱)。
对于简单测试,只需在命令行(或代码)中指定绝对路径。
要获取当前目录(要查看),getcwd()
C函数(也可在C ++中使用)将有所帮助。类似的东西:
char * dir = getcwd(NULL, 0); // Platform-dependent, see reference link below
printf("Current dir: %s", dir);
应该在控制台中显示它。 getcwd
函数有一些变化,具体取决于您运行的内容,我没有在Mac上测试,但信息在这里:
答案 1 :(得分:3)
您的可执行文件正在查找文件的“根”目录不是文件系统的实际/
根目录,而是可执行文件正在执行的目录...如果您是使用Xcode,这可能会被隐藏在由Xcode自动为您的项目创建的构建目录中,而不是像/Users/XXXXXX/Documents
那样的用户主文件夹或主文件夹子目录。
答案 2 :(得分:2)
“default directory”是执行可执行文件的目录。通常,它与可执行文件位于同一文件夹中,但如果您执行诸如在exe上拖放文件之类的操作,则可以更改启动路径。
如果从IDE内部运行程序,路径也会发生变化。 IDE启动可执行文件,因此无法确定它是从哪里执行的。您必须找到存储可执行文件的位置并将文件放在那里,或者使用绝对路径。
答案 3 :(得分:2)
在Xcode (撰写本文时为v7.1.1)侧边栏中,有一个名为&#34; Products&#34;的自动生成的文件夹。在你内部找到你项目的可执行文件(假设你已经至少建立了一次你的项目)。右键单击它&amp;选择&#34;在Finder&#34;中显示。文件夹将在Finder中打开。这是您的计划的工作目录,&amp;您会注意到它实际上并不在您项目的文件夹中。
您可以让Xcode使用不同的目录。在顶部工具栏的左侧,它显示活动构建体系结构旁边的项目名称,单击项目名称&gt;编辑方案......
然后寻找名为&#34;工作目录&#34;在出现的工作表中。勾选复选框&amp;然后选择一个自定义目录。 注意 :确保&#34;运行&#34;选项是该工作表侧栏中的选定选项。
答案 4 :(得分:0)
就我而言, - getcwd(NULL,0)返回&#34; /&#34;。 - 并且不能使用绝对路径。(它在部署的每个终端上都会发生变化。)
所以我通过ObjC代码获取路径并将其抛给c ++函数。
1.将文件放在xcode项目的顶级目录中。并检查它们是否包含在&#34;目标&#34; - &gt;&#34;构建阶段&#34; - &gt;&#34;复制捆绑资源&#34;。
2.通过ObjC代码获取路径。
NSBundle* bundle = [NSBundle mainBundle];
NSString* resourceDirectoryPath = [bundle bundlePath];
NSString* path = [resourceDirectoryPath stringByAppendingString: @"/"];
3.将它扔给c ++函数。
[self cppFunc:[path UTF8String]];
4.然后你可以在c ++中创建一个绝对文件路径。
std::string file = path(arg) + "filename";
它对我有用。