8

主にC++で記述されたiOSアプリでstd::ifstreamを使用してアセットフォルダーとそのサブフォルダーに保存されているファイルを読み取ろうとしています(同じコードが他のiOS以外のプロジェクトでも使用されています)が見つかりません。例:ファイルassets / Shaders / ortho2d.vertがあり、次のようにロードしようとしています。

std::ifstream vertFStream( vertFile ); // vertFile's contents is "assets/shaders/ortho2d.vert"
if (!vertFStream) {
    std::cerr << vertFile << " missing!" << std::endl;
    exit( 1 );
}

アセットフォルダーを青いフォルダーとしてXCodeプロジェクトに追加しました。これは、[ターゲット]->[バンドルリソースのコピー]に表示されます。

4

3 に答える 3

12

これを試して:

NSBundle *b = [NSBundle mainBundle];
NSString *dir = [b resourcePath];
NSArray *parts = [NSArray arrayWithObjects:
                  dir, @"assets", @"shaders", @"ortho2d.vert", (void *)nil];
NSString *path = [NSString pathWithComponents:parts];
const char *cpath = [path fileSystemRepresentation];
std::string vertFile(cpath);
std::ifstream vertFStream(vertFile);
于 2010-11-30T18:40:41.693 に答える
1

アプリケーションが実行されている場所からの相対パスを確認し、おそらくフルパスを使用してファイルが確実に見つかるようにする必要がある場合があります。

開くことが失敗したという事実は、必ずしもファイルが見つからないことを意味するわけではなく、現時点では読み取れない可能性があります。(不正な権限またはファイルがロックされています)。

exit(1)はかなり抜本的です。

于 2010-11-30T12:44:28.170 に答える
-1

申し訳ありませんが、句読点がいくつかあります。

  1. iOSでは、C ++からのファイルシステムコールを使用することは、セキュリティの問題とセキュリティの観点からの制限されたサポートのために強く推奨されていません。
    ファイルシステムへの呼び出しは、iOSアプリのフォルダーレイアウトを適切に理解した後で行う必要があります。(バンドル、リソース、ドキュメントフォルダなど)。そうしないと失敗します。c)c ++とobjCを混在させることはできますが、間違いなく正しいアプローチではありません。
  2. iOSでは、swiftまたはobjCを使用する必要があります(非常に限られた場合を除く)
  3. iOS APIを使用します。これは、Androidの場合とまったく同じようにJavaを使用します。
于 2017-07-27T10:59:13.980 に答える