トップページ > 記事閲覧
アンドロド開発でcsvが読み込めない
名前:隣の人 日時: 2018/09/15 22:44

こんにちは。 DXライブラリアンドロイド版を用いて開発をしているのですが、以下のコードでcsvが読み込めませんでした std::ifstream fin(path); if (!fin.is_open()) { printfDx("Error!!!"); } なお読み込みたいcsvファイルはUTF-8で保存しており、ソリューションエクスプローラからassetフォルダに追加してあります。 Windowsアプリケーション版では同じコードで問題なく動作しております。 自分のミスで読み込めていないこともありますのでプロジェクトのリンクも張っておきます。 Github https://github.com/SwordManNagaoka/SwordMan_Android/tree/Add_MapSystem 該当の個所はブランチ名Add_MapSystemのClassフォルダ内にあるMapLoader.hppです よろしくお願いします
メンテ

Page: 1 |

Re: アンドロド開発でcsvが読み込めない ( No.1 )
名前:管理人 日時:2018/09/16 02:11

ソリューションエクスプローラの assetsフォルダの中にあるファイルは CやC++の標準ファイルアクセス機能ではアクセスできませんので、std::ifstream でのアクセスも失敗します ( アセットマネージャーという API を使用する必要があります ) どうしても std::ifstream でアクセスする必要がある場合は、 // ファイルを開く int FileRead_open( const char *FilePath ) ; // ファイルのサイズを取得する LONGLONG FileRead_size( const char *FilePath ) ; // ファイルからデータを読み込む int FileRead_read( void *Buffer , int ReadSize , int FileHandle ) ; // ファイルを閉じる int FileRead_close( int FileHandle ) ; ↑の関数+ malloc を使用して、ファイルサイズを調べた後 malloc で確保したメモリに一度ファイルの内容を読み込み // アプリのデータ保存用のディレクトリパスを取得する int GetInternalDataPath( char *PathBuffer, int PathBufferBytes ) ; ↑こちらの関数でアプリが自由にファイルを保存できるフォルダを取得して、そのフォルダに fopen, fwrite, fclose でファイルを作成、読み込んだassets内のファイルの内容を書き出し、その上で std::ifstream で 読み込む必要があります
メンテ
Re: アンドロド開発でcsvが読み込めない ( No.2 )
名前:隣の人 日時:2018/09/16 15:48

返信ありがとうございます。 一度以下のようなコードを書いたのですがうまくいきませんでした //ファイルを開く int handle = FileRead_open(path.c_str()); //ファイルのサイズを取得する int64_t fileSize = FileRead_size(path.c_str()); //ファイルからデータを読み込む void *buffer = malloc(fileSize); FileRead_read(buffer, fileSize, handle); //ファイルを閉じる FileRead_close(handle); char pathBuffer[1024]; //アプリのデータ保存用のディレクトリパスを取得する GetInternalDataPath(pathBuffer, sizeof(pathBuffer)); FILE* fp = fopen(pathBuffer,"wb"); char data[2048]; if (fp != NULL) { printfDx("OK!!!");//来てない  fwrite(data, 1, sizeof(buffer), fp);  fclose(fp); } free(buffer); std::ifstream fin(data); if (fin.is_open() == 0) { printfDx("Error!!!"); } //チップIDの読み込み for (auto y(0u); y < yNum; ++y) { for (auto x(0u); x < xNum; ++x) { fin >> mapArray[y][x]; } } fin.close(); 用意されている関数の使い方が完全に理解しきれていないのでおかしい部分があると思うのですが、読み込み方がわかりません... 少なくともGetInternalDataPath(pathBuffer, sizeof(pathBuffer));まではうまくいっています(Errorだったら画面に出力するようにした) 取得できたパスは/data/user/o/com.SwordMan/files となっていることは確認できましたが、そこからどうすればよいのかがわかりません 現在の考え方は取得したパスに読み込みたいcsvの内容をコピーしたファイルを作成し、そこからifstreamで読み込むといった認識ですが大丈夫なのでしょうか?
メンテ
Re: アンドロド開発でcsvが読み込めない ( No.3 )
名前:yumetodo 日時:2018/09/16 18:17

ちょっと面倒だけどstd::streambufを継承するFileRead_xxx系を呼び出すクラスを作ればC++のI/O使えそう・・・
メンテ
Re: アンドロド開発でcsvが読み込めない ( No.4 )
名前:管理人 日時:2018/09/17 00:44

> 現在の考え方は取得したパスに読み込みたいcsvの内容をコピーしたファイルを作成し、そこからifstreamで読み込むといった認識ですが大丈夫なのでしょうか? はい、大丈夫です、その通りです 載せていただいたプログラムを正常に動作するように幾つか記述を変更したり追加したりしてみましたので、よろしければご覧ください //ファイルを開く int handle = FileRead_open(path.c_str()); //ファイルのサイズを取得する int64_t fileSize = FileRead_size(path.c_str()); //ファイルからデータを読み込む void *buffer = malloc(fileSize); FileRead_read(buffer, fileSize, handle); //ファイルを閉じる FileRead_close(handle); char pathBuffer[1024]; //アプリのデータ保存用のディレクトリパスを取得する GetInternalDataPath(pathBuffer, sizeof(pathBuffer)); //ディレクトリパスにディレクトリ区切りの『/』とテンポラリファイルの名前を追加する strcat( pathBuffer, "/tempfile.txt" ); //テンポラリファイルを書き込み用に開く FILE* fp = fopen(pathBuffer,"wb"); if (fp != NULL) { printfDx("OK!!!");//来てない //テンポラリファイルにcsvファイルの内容を書き出す  fwrite(buffer, 1, fileSize, fp); //ファイルを閉じる  fclose(fp); } //確保したメモリを解放 free(buffer); //テンポラリファイルを開く std::ifstream fin(pathBuffer); if (fin.is_open() == 0) { printfDx("Error!!!"); } //チップIDの読み込み for (auto y(0u); y < yNum; ++y) { for (auto x(0u); x < xNum; ++x) { fin >> mapArray[y][x]; } } fin.close();
メンテ
Re: アンドロド開発でcsvが読み込めない ( No.5 )
名前:隣の人 日時:2018/09/17 01:12

提示していただいたコードを入力したら無事に期待していた結果になりました! ありがとうございます
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存