テキストから文字列を格納する関数を作ったのですが・・・

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
パン粉茄子

テキストから文字列を格納する関数を作ったのですが・・・

#1

投稿記事 by パン粉茄子 » 14年前

ライトノベル風文字列表示の仕方を、元から配列に格納された文字列ではなく、テキストファイルから読み込んだ文字列を表示しようと思い、ある関数を作りました。

①指定されたテキストファイルから文字列を読み込む。
②指定された配列に格納。

という単純な処理をする関数なのですが、どうも見た目がカッコ悪い・・・というか、実用的(?)でないような気がして・・・
とりあえず自分でプログラムしてみたものです。

コード:

//main.cpp
#define GROBAL_INSTANCE
#include "GV.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	Window_Init();     //スクリーン設定のMessageBoxとかDxLib_Initとか

       //第一引数:読み込むテキスト
       //第二引数:文字列を格納する変数
               //第三引数:文字列の行数
		Text_Input("test.txt",str,256);

	while(!ProcessLoop() && !Key[KEY_INPUT_ESCAPE]){

		DrawFormatString(0, 0,GetColor(255,255,255),"%s",str[0]);
		DrawFormatString(0,24,GetColor(255,255,255),"%s",str[1]);
		DrawFormatString(0,48,GetColor(255,255,255),"%s",str[2]);

		SetDrawFPS(TRUE);   //FPS表示
	}

	DxLib_End();
	return 0;
}

コード:

//Text.cpp
#include "GV.h"

int Text_Input(char TextName[],char val[][256],int gyou){
	FILE *fp;

	if((fp=fopen(TextName,"r+"))==NULL)    //エラー処理
         return -1;

	for(int i=0;i<gyou;i++){    //行数分ループして指定した変数に一行ずつ格納
		fgets(val[i],256,fp);
		
		if(val[i][strlen(val[i])-1]=='\n')   //もし行の最後が\nだったら
			val[i][strlen(val[i])-1]='\0';  //その部分を\0にする。
                              //※DrawString系の関数では\nが・になるため。
	}

	fclose(fp);

	return 0;
}

コード:

//GV.h
#pragma warning(disable:4996)

#include "DxLib.h"
#include "Define.h"

#ifdef	GROBAL_INSTANCE
#define	GROBAL
#else
#define	GROBAL extern
#endif

#include "Function.h"

GROBAL char str[256][256];  //文字列を格納する配列
一応思った通りの処理をしてくれているのでこれでもいいのですが、みなさんだったら同じ処理の関数をどう作るのかと思い、トピックを立ててみました。
「指定されたテキスト内の文字列を指定された変数に格納する関数」のプログラムを作ってみてほしいです。
よろしくお願いします。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: テキストから文字列を格納する関数を作ったのですが・・・

#2

投稿記事 by h2so5 » 14年前

実用性を考えるなら自分の場合はSTLを使いますね。
メモリの無駄もないですし、テキストファイルの行数が増えても対応できます。

(参考までに。テストしてないので間違ってるかも^^;)

コード:

//main.cpp
#define GROBAL_INSTANCE
#include "GV.h"

#include <fstream>
#include <string>
#include <vector>
using namespace std;
 
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
    Window_Init();     //スクリーン設定のMessageBoxとかDxLib_Initとか
 
	ifstream ifs("test.txt");
	vector<string> text; 

	// 1行ずつ読み込み
	while(!ifs.eof()) {
		string str;
		getline(ifs, str);
		text.push_back(str);
	}
 
    while(!ProcessLoop() && !Key[KEY_INPUT_ESCAPE]){
 		
		int top = 0;
 		vector<string>::iterator it = text.begin();
		while(it != text.end()) {
			DrawFormatString(0, top, GetColor(255,255,255), "%s", it->c_str());
			top += 24;
		}
 
        SetDrawFPS(TRUE);   //FPS表示
    }
 
    DxLib_End();
    return 0;
}

パン粉茄子

Re: テキストから文字列を格納する関数を作ったのですが・・・

#3

投稿記事 by パン粉茄子 » 14年前

返信遅れて申し訳ありません。 h2so5さんありがとうございます。

ムムム・・・C++だと記述がこんな簡潔になるんですね。
DXライブラリに頼り切ってゲーム作りを始める前にC++を学んだほうが良さそうかなorz

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: テキストから文字列を格納する関数を作ったのですが・・・

#4

投稿記事 by ISLe » 14年前

わたしのブログ記事ですけど…
禁則処理付き折り返し文字列描画【ShiftJIS版/改行付き】
1次元配列のバッファへシリアルに文字コードを追加します。
処理対象文字列へのポインタをリセットすれば次々にバッファへ追加していくことができます。
本来リングバッファとすべきですが複雑になるので実装してません。バッファサイズを超えて追加するとたいへんなことになります。

メインメモリ1MBスタックサイズ64KBとかの環境用に書いたコードが元になってます。
実績のあるコードなのでそれなりの実用性はあると思います。

パン粉茄子

Re: テキストから文字列を格納する関数を作ったのですが・・・

#5

投稿記事 by パン粉茄子 » 14年前

ありがとうございます。
ISLe様のブログを何度も拝見させていただいていますが、実用性までを考えるとなると、やはり難しくなっていくものですね・・・orz

お二人様のコードを拝見させていただいた結果、今の自分の知識では実用性までを考えた関数なんて作れそうにないと気づき、もう一度プログラムを勉強しなおすことに決めました。
本当はもう少しレスがあるまで待ちたいところですが、なさそうなのでここで解決とさせていただきます。
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る