【问题标题】:New to Xcode can't open files in c++?Xcode 新手无法在 C++ 中打开文件?
【发布时间】:2014-06-19 17:50:12
【问题描述】:

我一直在学习的课程中使用 windows,但我正在尝试运行一个基本代码来弄清楚如何从 Xcode 上的文件中打开/关闭/输入/输出以及我通常在视觉上使用的代码工作室不知道为什么?谢谢!

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

int main()
{
    ifstream fin;
    ofstream fout;
    string input;

    fin.open("inputFile.txt");
    if(fin.fail())
        cout << "File failed to open." << endl;
    fin >> input;

    fout.open("outputFile.txt");

    fout << input;


}

【问题讨论】:

  • 也 #include 它没有复制...无论哪种方式我的输出都是“文件无法打开。”
  • inputFile.txt在哪里?
  • 尝试指定文件的绝对路径。 XCode 在您的源代码所在的另一个位置执行,因此假设源目录的相对路径将不起作用。
  • 欢迎来到 Xcode。你会找到this answer helpful,我几乎可以肯定。

标签: c++ xcode


【解决方案1】:

将您的 .txt 文件放在您的 main.cpp 文件所在的同一目录中(或您喜欢的任何位置)。

在 Xcode 中,转到 Product > Scheme > Edit Scheme > Run test(右侧)> Options(中间顶部)

在“选项”下选中“使用自定义工作目录”并将其设置为 .txt 文件所在的目录。

要使用文件,您必须只指定文件名,例如in_file.open("inputFile.txt");不需要路径。

【讨论】:

  • 但是如果你使用 git 或 svn 并且人们使用相同的 xcode 项目文件并且他们不想为每个用户更改方案,你怎么能这样做。
  • @nepete 你能告诉我为什么每次我们尝试用 c++ 打开一个新文件时都必须这样做吗?
  • @user11954047,首先了解工作区、项目、目标和方案之间的区别可能会有所帮助。这是good explanation。此线程中的bames53's answer 也可能会有所帮助。
  • 此选项在 XCode 11 中不可用
【解决方案2】:

这是一种完全不同的方法:让 Xcode 为您复制输入文件。

  • 在 Xcode 中选择您的项目
  • 选择构建阶段
  • 点击“+”按钮创建一个新的构建阶段

  • 选择新建复制文件构建阶段

  • 选择产品目录
  • 点击“+”按钮添加文件

  • 点击添加其他

  • 选择您的输入文件并点击打开

  • 选中复制项目...复选框并点击完成

现在每次构建项目时,输入文件都将被复制到与可执行文件相同的文件夹中,无论它是在哪里构建的。当然,要查看输出文件,您仍然需要在 Finder 中找到可执行文件。

【讨论】:

  • 最佳答案在这里!谢谢!
  • 我可以用这个解决方案访问我的文件!
  • 再次在 xCode IDE 中更进一步!谢谢!
【解决方案3】:

答案并不能真正解释问题,所以我想我会这样做。

当您将“inputFile.txt”之类的相对路径传递给文件 API 时,在执行程序时,它会被视为相对于工作目录。当您使用 cmd.exe 或 Terminal.app 或一般命令行时,这与“工作目录”相同。 Unix 命令pwd(“打印工作目录”)显示当前工作目录。在 Windows 上运行不带参数的命令 cd 执行相同的功能。 (在 Unix 上运行 cd 且不带参数会将工作目录更改为用户的主目录。)

当您从命令行运行程序时,命令行 shell 会设置程序的工作目录。当您从 IDE 中运行程序时,IDE 会设置工作目录。由于与命令行不同,对于 IDE 应将什么设置为工作目录没有明显的答案,因此 Visual Studio 和 Xcode 默认将工作目录设置为不同的位置:Visual Studio 将工作目录设置为 $(ProjectDir),该目录包含 Visual Studio 项目文件; Xcode 将工作目录设置为构建产品目录,即可执行文件写入的位置。

您的问题的一些可能解决方案是:

  1. 不要使用相对路径,因此不要依赖于工作目录。这对使程序更具可移植性没有多大帮助,因为平台之间的绝对路径也会有所不同,因此您仍然必须为每个平台“配置”程序。事实上,使用绝对路径更糟糕,因为这意味着您的源代码必须不同,而最好将这种差异限制在每个平台的构建配置中。

  2. 配置 IDE 以使用所需的工作目录。可以通过右键单击项目来配置 Visual Studio,选择配置属性 > 调试 > 工作目录,并将工作目录设置为所需的路径(可能使用 Visual Studio 构建变量)。

    nepete's answer描述了如何配置Xcode直接设置的工作。

  3. 配置 IDE 的构建过程以将数据文件复制到适当的位置。在 Visual Studio 中,您可以在 C++ 项目中通过配置项目的属性 > 配置属性 > 生成事件来执行此操作。

    SSteve's answer 介绍了如何在 Xcode 中配置额外的构建步骤。

【讨论】:

    【解决方案4】:

    我猜你在包含你的源代码的文件夹中有 inputFile.txt。那是行不通的。您需要将其放在包含生成的可执行文件的文件夹中。要找到该文件夹​​,请在 Products 下右键单击您的应用,然后选择 Show In Finder

    此图像显示了命令行程序的外观。它还显示已打开的 Finder 窗口。如您所见,它与包含源代码的文件夹不同。

    【讨论】:

    • 好的,它和我的源代码在同一个文件夹中,但是我对你的意思有点困惑。我在“products”文件夹的finder中点击了show,它只找到了一个文件,我的源代码所在的文件已经是……我做错了什么吗?
    • 文件夹不要右键,打开文件夹右键文件夹中的项目。我添加了一个屏幕截图,显示了命令行程序的外观(在本例中称为asdf)。
    【解决方案5】:

    按照 nepete 的建议,编辑方案,但使用 $PROJECT_DIR 作为自定义工作目录。帮助移动项目,或在两种不同的环境(例如家庭和办公室)中工作。

    顺便说一句。 $PROJECT_DIR 是 Xcode 环境变量之一,还有助于将文件名作为命令行参数传递给程序(可在方案中的“参数”下设置)。

    【讨论】:

      【解决方案6】:

      我今天也遇到了同样的问题。我想将 C 代码添加到我的 Swift 项目中,而我的文件指针始终为 NULL。

      不幸的是,在 XCode 9 for iOS 应用程序中,我无法更改工作目录。更改构建阶段也对我没有帮助。经过 4 多个小时的反复试验,这就是我最终想出的方法:

      1. 在将文件复制到 XCode 时,我选择了“创建组”,但我需要选择“创建文件夹引用”:

      1. 我创建了一个新的 Objective-c 文件 (.m) 并将我的所有 C 代码复制到那里。

      2. 我没有修改 .h 文件(XCode 生成的桥接头和我自己的带有公共函数声明的 .h 文件)。现在我的项目结构如下所示:

      1. 在我的 dict.m 文件中代替之前的纯 c fopen 部分:

        FILE *dic = fopen("dictionary.txt", "r");
        

        我添加了 obj-C 代码:

        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"dictionary" ofType:@"txt"];
        FILE *dic = fopen([filePath cStringUsingEncoding: NSUTF8StringEncoding], "r");
        

      它现在可以正常工作了!真是太棒了!

      ps 我决定写下这个答案,以防它对像我这样的人有所帮助并节省他们一些时间。如果您知道如何在 XCode 9 for iOS 中更改工作目录,请给我留言 - 现在我真的很好奇为什么我找不到它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-11
        • 1970-01-01
        相关资源
        最近更新 更多