【问题标题】:Xcode App No Longer Reads Input From the Folder The App is Stored InXcode 应用程序不再从应用程序存储的文件夹中读取输入
【发布时间】:2017-04-16 16:33:21
【问题描述】:

标题有点冗长,但基本上,我已经编写了一个应用程序,它可以读取和写入其输入和输出到文本文件。在整个过程中,它将直接在与我的 Xcode 派生数据->项目->构建->产品->调试文件夹相同的目录中读取和写入文件。这是所有东西都被写入和读取的地方。我没有为应用程序设置自定义路径,因此它只是保存应用程序所在的任何位置。有史以来第一次,我运行 Apple 的 Instruments 应用程序,尝试学习如何使用分析器。在 Instruments 中选择这个应用程序作为目标后不久,我又回到 Xcode 应用程序运行程序。在 Xcode 中一切正常。它从文件中读取并打印到与文件夹位于同一位置的文件,但是如果我尝试通过单击文件并打开终端来运行实际程序本身,它不再读取或打印到应用程序所在的目录取而代之的是,它从我的主文件夹中打印和读取。我不知道发生了什么变化或导致它发生变化的原因,但我希望它是一个简单的修复。我希望应用程序再次从其所在的目录中读取文件并打印文件。我不确定它是 Xcode 设置还是终端设置。

任何帮助将不胜感激。

更新 1:没有运气的尝试:

how to change the working directory to the location of the program

目录字段是空白的,所以我认为这是解决方案,但用建议填写它并不能缓解问题。

更新 2:

刚刚尝试删除首选项文件,仍然没有解决方案。我愿意给某人声誉。我没有很多,因为我是一个新成员,但我会把这个人认为公平的东西给解决它的人。我很绝望,真的不想等 2 天才能解决这个问题。

更新 3:

尝试将方案部分的“配置文件(发布)->选项区域中的默认路径更改为更新 1 中建议的默认变量。没有运气。我开始失去理智了。

更新 4:

我已尝试完全删除该方案并制作一个新方案,希望该方案可能存在一些问题,但这并没有解决问题。在 Xcode 中运行应用程序时的输入和输出仍然使用工作目录,而在调试文件夹中运行可执行文件时使用主文件夹。

更新 5:

刚刚在较旧的 iMac 和 Xcode 设置(OS 10.8.5 和 Xcode 5.1.1)上对此进行了测试,它似乎工作正常,可以在调试文件夹中读取和写入应用程序的当前工作目录。

【问题讨论】:

  • 有人有这方面的经验吗?即使将运行方案设置为主目录,它仍会从我的主用户文件夹中存储和读取。非常令人沮丧。我会尝试任何建议。我想知道 Xcode 的设置文件是否在我的 comp 中损坏。
  • 你使用的是什么版本的 Xcode?​​span>
  • 绝对最新版本,8.1?不确定,因为我现在不在电脑旁。今晚下班后我可以适应。

标签: c++ xcode redirect terminal


【解决方案1】:

无论出于何种原因,https://stackoverflow.com/a/15537436/1035008 建议的解决方案不再有效。可能在 Xcode 8.1 中损坏。但这似乎有效:

#include <iostream>
#include <fstream>
#include <unistd.h>

using namespace std;

int main (int argc, const char * argv[])
{
    // argv[0] returns the full path to the program, in my case "/Users/yuchen/Library/Developer/Xcode/DerivedData/../Debug/test
    string directory(argv[0]);
    // And we want to get rid of the program name `test`
    directory = directory.substr(0, directory.find_last_of("/"));
    // Point the directory to the program directory
    chdir(directory.c_str());

    cout << "Current directory is: " << getcwd(NULL, 0) << endl; // /Users/yuchen/Library/Developer/Xcode/DerivedData/../Debug/

    ifstream fin("hi.txt");
    if (fin.is_open()) cout << "File is Open" << endl;
    else cout << "File is not open" << endl;
    fin.close();

    return 0;
}

另见SOSO。希望这可以帮助。

【讨论】:

  • 你也坏了吗?
  • @joe_04_04 是的,不知道为什么。也许苹果是故意这样做的。他们不希望人们从程序目录中读取输入文件。
  • 我发誓我们以前能够做到这一点。更新后甚至没有改变,直到最近它一直有效。很奇怪。
  • 另外,我们能够在 Xcode 中运行应用程序并使用那里的工作目录,只是在 Xcode 之外运行应用程序本身时不行。也许我应该把它作为一个错误报告给苹果?
  • @joe_04_04 也可能是因为 MacOS 更新,不一定是 Xcode 本身。是的,请随时提交错误报告,看看他们怎么说。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-24
  • 2021-07-14
相关资源
最近更新 更多