トップページ > 記事閲覧
【Android版】外部ファイルの操作について
名前:Ketty 日時: 2019/10/22 23:31

いつも楽しくDXライブラリを利用させてもらってます(^▽^) ↓こちらの続きで大変もうしわけないのですが、不明点があるため教えていただきたいです。 https://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=4728 やりたいこととしては、 InternalDataPathに対して、簡単なテキストファイルを 書き込み⇒読み込み⇒printDxで結果を確認する、ということです。 下記のコードで実験したのですが何も表示されないので悩んでいます。 (※言語がCではなく、C++ですので、ここに質問すること自体不適切であればご指摘ください) 【コードここから(main.cppのみです)】 #include <DxLib.h> #include <string> #include <vector> #include <fstream> const int SCREEN_X = 480; const int SCREEN_Y = 800; const int COLOR_DIPS = 16; // テキストファイルを保存します bool SaveText(const std::string& filePath, const std::vector<std::string>& in_textList) { // outputストリームの生成 std::ofstream ofs; // 追記モード ofs.open(filePath.c_str(), std::ios::out | std::ios::app); // outputストリームがOPENできなかったらfalseを返す if (ofs.is_open() == false) { return false; } else { // 全行をストリームに出力 for (std::vector<std::string>::const_iterator fr = in_textList.begin(), to = in_textList.end(); fr != to; ++fr) { ofs << (*fr) << std::endl; } // エラーが発生したり失敗したらfalseを返す bool isSuccess = (ofs.bad() == false && ofs.fail() == false); // outputストリームを閉じる ofs.close(); return isSuccess; } } // テキストファイルをロードします bool LoadText(const std::string& filePath, std::vector<std::string>& out_textList, const unsigned int& lineBufSize) { // 戻り値をクリア out_textList.clear(); //-------------------------- // 1.ファイルOPEN //-------------------------- const int fileHandle = DxLib::FileRead_open(filePath.c_str(), FALSE); // ファイルOPENに失敗したら直ちに終了する if (fileHandle == 0) { // エラー DxLib::printfDx("ファイルOpenエラー"); return false; } //-------------------------- // 2.ファイル読み取り //-------------------------- // ファイル1行分のバッファ領域を確保 char *buf = new char[lineBufSize]; // ファイルの終端が来るまでループ while (DxLib::FileRead_eof(fileHandle) == 0) { // 一応念のためウインドウのメッセージを処理を行います if (DxLib::ProcessMessage() != 0) { return false; } // 1行読み込み const int result = DxLib::FileRead_gets(buf, lineBufSize, fileHandle); // 1行読み込みに失敗したら直ちに終了します if (result == -1) { // エラー DxLib::printfDx("1行読み込みエラー"); // 忘れずにバッファ破棄 delete[] buf; return false; } // 読み込み行が無くなったら脱出します if (result == 0) { break; } // 戻り値に追記する out_textList.push_back(buf); } // バッファ破棄 delete[] buf; //-------------------------- // 3.ファイルCLOSE //-------------------------- // ファイルCLOSE if (DxLib::FileRead_close(fileHandle) == -1) { // エラー DxLib::printfDx("ファイルCloseエラー"); return false; } return true; } // プログラムは android_main から始まります int android_main(void) { // DXライブラリ初期化 if (DxLib::DxLib_Init() == -1) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // グラフモード設定 DxLib::SetGraphMode(SCREEN_X, SCREEN_Y, COLOR_DIPS); // 画面を青くする DxLib::DrawBox(0, 0, SCREEN_X, SCREEN_Y, DxLib::GetColor(0, 0, 255), TRUE); // InternalDataPathを取得 char internalDataPath[1024]; DxLib::GetInternalDataPath(internalDataPath, sizeof(internalDataPath)); // InternalDataPath の末尾に『/』+『読み込みたいファイル名』を加えた文字列を作成 // https://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=4125 char testFilePath[1024]; ::sprintf(testFilePath, "%s/test.text", internalDataPath); // ファイル書き込み std::vector<std::string> writeRows(2); writeRows.push_back("これはテストです。"); writeRows.push_back("あああああ"); if (SaveText(testFilePath, writeRows) == false) { DxLib::printfDx("ファイル書き込み失敗しました。"); } // ファイル読み取り std::vector<std::string> loadRows(2); if (LoadText(testFilePath, loadRows, loadRows.size()) == false) { DxLib::printfDx("ファイル読み取り失敗しました。"); } // ファイルから読み取った行を出力 for (int i = 0, n = loadRows.size(); i < n; ++i) { DxLib::printfDx(loadRows[i].c_str()); } // printfDxを描画 DxLib::ScreenFlip(); DxLib::WaitKey(); // キー入力待ち DxLib::DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 } 【コードここまで】 DXライブラリは長く使わせていただいておりますが、Android版についてはほとんど経験がないため私の認識誤りがあるかと思います。 何か根本的な間違いをしているでしょうか?? 【環境】 Windows10 Visual Studio 2017 Community DXライブラリ 3.21b
メンテ

Page: 1 |

Re: 【Android版】外部ファイルの操作について ( No.1 )
名前:管理人 日時:2019/10/23 01:43

Android 特有の処理については問題ないと思います stdに詳しくないので単純に『こうすれば正常に動作した』の内容となりますが // ファイル書き込み std::vector<std::string> writeRows(2); ↑こちらの writeRows(2); を writeRows(0); に // ファイル読み取り std::vector<std::string> loadRows(2); if (LoadText(testFilePath, loadRows, loadRows.size()) == false) ↑こちらの loadRows(2) を loadRows(0) に、loadRows.size() を 1024 にしたら 画面にテキストが表示されました ただ、SaveText では追記書き込みになっている関係で既に何回も実行されていましたら 行数がすごい数になっていて画面にテキストが収まりきらないかもしれません
メンテ
Re: 【Android版】外部ファイルの操作について(解決 ( No.2 )
名前:Ketty(解決) 日時:2019/10/23 19:51

ご回答ありがとうございます(^ ^) おっしゃるとおりのコードに直したら表示されました。 おかげさまで原因も分かりました。 原因は、私が (1)std::vectorの使い方を間違っていたこと   ×:コンストラクタ引数を与えると初期容量が決まる   〇:コンストラクタ引数を与えると空要素ができる (2)lineBufSizeの意味を取り違えていたこと   ×:行数を指定する   〇:1行当たりの最大サイズを指定する の2点でした。。。 お騒がせしてしまいすみません。 解決とさせていただきますm(_ _m 下記に修正後コードを記載しておきます。 (追記モード⇒上書きモードに変えました) ◆コード #include <DxLib.h> #include <string> #include <vector> #include <fstream> const int SCREEN_X = 480; const int SCREEN_Y = 800; const int COLOR_DIPS = 16; // テキストファイルを保存します bool SaveText(const std::string& filePath, const std::vector<std::string>& in_textList) { // outputストリームの生成 std::ofstream ofs; // 上書きモード ofs.open(filePath.c_str(), std::ios::out | std::ios::ate); // outputストリームがOPENできなかったらfalseを返す if (ofs.is_open() == false) { return false; } else { // 全行をストリームに出力 for (std::vector<std::string>::const_iterator fr = in_textList.begin(), to = in_textList.end(); fr != to; ++fr) { ofs << (*fr) << std::endl; } // エラーが発生したり失敗したらfalseを返す bool isSuccess = (ofs.bad() == false && ofs.fail() == false); // outputストリームを閉じる ofs.close(); return isSuccess; } } // テキストファイルをロードします bool LoadText(const std::string& filePath, std::vector<std::string>& out_textList, const unsigned int& lineBufSize) { // 戻り値をクリア out_textList.clear(); //-------------------------- // 1.ファイルOPEN //-------------------------- const int fileHandle = DxLib::FileRead_open(filePath.c_str(), FALSE); // ファイルOPENに失敗したら直ちに終了する if (fileHandle == 0) { // エラー DxLib::printfDx("ファイルOpenエラー"); return false; } //-------------------------- // 2.ファイル読み取り //-------------------------- // ファイル1行分のバッファ領域を確保 char *buf = new char[lineBufSize]; // ファイルの終端が来るまでループ while (DxLib::FileRead_eof(fileHandle) == 0) { // 一応念のためウインドウのメッセージを処理を行います if (DxLib::ProcessMessage() != 0) { return false; } // 1行読み込み const int result = DxLib::FileRead_gets(buf, lineBufSize, fileHandle); // 1行読み込みに失敗したら直ちに終了します if (result == -1) { // エラー DxLib::printfDx("1行読み込みエラー"); // 忘れずにバッファ破棄 delete[] buf; return false; } // 読み込み行が無くなったら脱出します if (result == 0) { break; } // 戻り値に追記する out_textList.push_back(buf); } // バッファ破棄 delete[] buf; //-------------------------- // 3.ファイルCLOSE //-------------------------- // ファイルCLOSE if (DxLib::FileRead_close(fileHandle) == -1) { // エラー DxLib::printfDx("ファイルCloseエラー"); return false; } return true; } // プログラムは android_main から始まります int android_main(void) { // DXライブラリ初期化 if (DxLib::DxLib_Init() == -1) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // グラフモード設定 DxLib::SetGraphMode(SCREEN_X, SCREEN_Y, COLOR_DIPS); // 画面を青くする DxLib::DrawBox(0, 0, SCREEN_X, SCREEN_Y, DxLib::GetColor(0, 0, 255), TRUE); // InternalDataPathを取得 char internalDataPath[1024]; DxLib::GetInternalDataPath(internalDataPath, sizeof(internalDataPath)); // InternalDataPath の末尾に『/』+『読み込みたいファイル名』を加えた文字列を作成 // https://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=4125 char testFilePath[1024]; ::sprintf(testFilePath, "%s/test.text", internalDataPath); // ファイル書き込み(上書き) const unsigned int ROW_NUM = 2; // 行数は2 std::vector<std::string> writeRows; writeRows.reserve(ROW_NUM); // 行の数だけ容量だけを事前に確保 ※なくてもいい writeRows.push_back("これはテストです。"); writeRows.push_back("あああああ。"); if (SaveText(testFilePath, writeRows) == false) { DxLib::printfDx("ファイル書き込み失敗しました。"); } // ファイル読み取り std::vector<std::string> loadRows; loadRows.reserve(ROW_NUM); // 行の数だけ容量だけを事前に確保 ※なくてもいい if (LoadText(testFilePath, loadRows, 1024) == false) { DxLib::printfDx("ファイル読み取り失敗しました。"); } // ファイルから読み取った行を出力 for (int i = 0, n = loadRows.size(); i < n; ++i) { DxLib::printfDx(loadRows[i].c_str()); } // printfDxを描画 DxLib::ScreenFlip(); DxLib::WaitKey(); // キー入力待ち DxLib::DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 }
メンテ

Page: 1 |

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

   クッキー保存