web-dev-qa-db-ja.com

Xcodeがc ++でファイルを開けないのは初めてですか?

私は取っているクラスでウィンドウを使用していますが、基本的なコードを実行して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;


}
38
user3473255

.txtファイルを、main.cppファイルと同じディレクトリ(または任意の場所)に配置します。

Xcodeで、[製品]> [スキーム]> [スキームの編集]> [テストの実行](右側)> [オプション](中央上部)に移動します。

[オプション]の下の[カスタム作業ディレクトリを使用する]をオンにして、.txtファイルがあるディレクトリに設定します。

ファイルを操作するには、ファイル名だけを指定する必要があります。 in_file.open( "inputFile.txt");パスは必要ありません。

67
nepete

まったく異なるアプローチを次に示します。Xcodeに入力ファイルをコピーさせます。

  • Xcodeでプロジェクトを選択します
  • ビルドフェーズの選択
  • [+]ボタンをクリックして、新しいビルドフェーズを作成します

Steps 1-3

  • 新しいコピーファイルのビルドフェーズを選択します

Step 4

  • 製品ディレクトリを選択します
  • 「+」ボタンをクリックしてファイルを追加します

Steps 5-6

  • その他の追加をクリックします

Step 7

  • 入力ファイルを選択し、開くをクリックします

Step 8

  • アイテムのコピー…チェックボックスをオンにして、[完了]をクリックします。

Step 9

これで、プロジェクトをビルドするたびに、入力ファイルは、ビルドの場所に関係なく、実行可能ファイルと同じフォルダーにコピーされます。もちろん、出力ファイルを表示するには、Finderで実行可能ファイルを見つける必要があります。

26
SSteve

答えは本当に問題を説明していないので、私はそれをしたいと思った。

「inputFile.txt」のような相対パスをファイルAPIに渡すと、プログラムの実行時に作業ディレクトリに対する相対パスとして扱われます。これは、一般的にcmd.exeまたはTerminal.appまたはコマンドラインを使用する場合の「作業ディレクトリ」と同じです。 Unixコマンドpwd( "作業ディレクトリの印刷")は、現在の作業ディレクトリを表示します。 Windowsでコマンドcdを引数なしで実行すると、同じ機能が実行されます。 (Unixでは、cdを引数なしで実行すると、作業ディレクトリがユーザーのホームディレクトリに変更されます。)

コマンドラインからプログラムを実行すると、コマンドラインシェルがプログラムの作業ディレクトリを設定します。 IDE内からプログラムを実行すると、IDEは作業ディレクトリを設定します。コマンドラインとは異なり、IDE =作業ディレクトリとして設定する必要があり、Visual StudioおよびXcodeは作業ディレクトリをデフォルトで異なる場所に設定します。VisualStudioは作業ディレクトリを$(ProjectDir)(Visual Studioプロジェクトファイルを含むディレクトリ)に設定します。ビルド製品ディレクトリ、つまり実行可能ファイルが書き込まれた場所へのディレクトリ。

問題に対するいくつかの可能な解決策は次のとおりです。

  1. 相対パスを使用しないでください。したがって、作業ディレクトリに依存しません。絶対パスもプラットフォーム間で異なるため、これはプログラムの移植性を高めるのにあまり役立ちません。そのため、プラットフォームごとにプログラムを「構成」する必要があります。実際、絶対コードを使用することは、ソースコードが異なる必要があることを意味するため、より悪いですが、その違いは各プラットフォームのビルド構成に限定する方がよいでしょう。

  2. IDEを設定して、目的の作業ディレクトリを使用します。VisualStudioは、プロジェクトを右クリックし、[構成プロパティ]> [デバッグ]> [作業ディレクトリ]を選択し、 Visual Studioビルド変数を使用)。

    nepete's answer は、Xcodeによって直接設定された動作を設定する方法を説明しています。

  3. IDEのビルドプロセスを構成して、データファイルを適切な場所にコピーします。 Visual Studioでは、プロジェクトの[プロパティ]> [構成プロパティ]> [ビルドイベント]を構成することにより、C++プロジェクトでこれを行います。

    SSteveの答え は、Xcodeで追加のビルドステップを構成する方法をカバーしています。

4
bames53

Nepeteが示唆するように、スキームを編集しますが、カスタム作業ディレクトリとして$ PROJECT_DIRを使用します。プロジェクトを移動したり、2つの異なる環境(自宅やオフィスなど)で作業したりするのに役立ちます。

ところで。 $ PROJECT_DIRはXcode環境変数の1つであり、ファイル名をコマンドライン引数としてプログラムに渡すのにも役立ちます(スキームの「引数」で設定可能)。

2
jendrek

ソースコードを含むフォルダーにinputFile.txtがあると思います。それはうまくいきません。生成された実行可能ファイルを含むフォルダーに配置する必要があります。そのフォルダーを見つけるには、Productsの下でアプリを右クリックし、Show In Finderを選択します。

enter image description here

この画像は、コマンドラインプログラムの外観を示しています。また、開いたFinderウィンドウも表示されます。ご覧のとおり、ソースコードを含むフォルダーとは別のフォルダーです。

Command Line version

1
SSteve

今日も同じ問題に苦しんでいます。 SwiftプロジェクトにCコードを追加したかったのですが、ファイルポインターは常にNULLでした。

残念ながら、iOSアプリのXCode 9では、作業ディレクトリを変更できませんでした。ビルドフェーズを変更しても、助けにはなりませんでした。 4時間以上の試行錯誤の後、それが最終的に思いついたものであり、動作します:

  1. xCodeにファイルをコピーするとき、「グループの作成」を選択しましたが、「フォルダー参照の作成」を選択する必要がありました。

enter image description here

  1. 新しいObjective-Cファイル(.m)を作成し、そこにすべてのCコードをコピーしました。

  2. そのままの.hファイルを残しました(XCodeが生成したブリッジングヘッダーと、パブリック関数宣言を含む自分の.hファイル)。プロジェクトの構造は次のようになりました。

enter image description here

  1. 以前のプレーンなfopen部分の代わりに私のdict.mファイルで:

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

    Obj-Cコードを追加しました:

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

そして、問題なく動作するようになりました!すごい!

pS私がこのような答えを書いて、私のような人を助け、時間を節約できるようにすることにしました。 iOS用XCode 9で作業ディレクトリを変更する方法を知っている場合は、コメントを残してください-なぜ私はそれを見つけることができないのか本当に興味があります。

0
joliejuly