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
提示していただいたコードを入力したら無事に期待していた結果になりました!
ありがとうございます
|