csv(txt)ファイルから読み込んだ文字の描画

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

csv(txt)ファイルから読み込んだ文字の描画

#1

投稿記事 by mi_l » 12年前

コード:

あいうえお,
かきくけこさしすせそ,
たちつてと,
/ここから下は・・・・・・・・・・・・・・・・・・・・・
なにぬねの,
はひふへほ,
まみむめも,
やゆよ,
らりるれろ,
龍神録からコピペして所々変えただけです(load_storyなど関数名はあまり気にしないでください)
全て同じファイルに書いているわけではありません(点線内は同じファイル)

コード:

//-----------------------------------------
typedef struct
{
	char *st;
}String;
//------------------------------------
String str;
//-----------------------------------
#define MAX_STR 8//今のところは8行なので・・(コメント文は除く)
//----------------------------------------------------------------------------
memset(str , 0 , sizeof(String)*MAX_STR);//初期化
//--------------------------------------------------------------------------
void load_story(){
        int n,num,i,fp;
        char fname[256]={"上のテキストファイル"};
        int input[256];
        char inputc[256];

        fp = FileRead_open(fname);//ファイル読み込み
        if(fp == NULL){
                printfDx("read error\n");
                return;
        }
     /*   for(i=0;i<2;i++)//最初の2行読み飛ばす
                while(FileRead_getc(fp)!='\n');*/

        n=0 ;
        while(1){
                for(i=0;i<256;i++){
                        inputc[i]=input[i]=FileRead_getc(fp);//1文字取得する
                        if(inputc[i]=='/'){//スラッシュがあれば
                                while(FileRead_getc(fp)!='\n');//改行までループ
                                i=-1;//カウンタを最初に戻して
                                continue;
                        }
                        if(input[i]==',' || input[i]=='\n'){//カンマか改行なら
                                inputc[i]='\0';//そこまでを文字列とし
                                break;
                        }
                        if(input[i]==EOF){//ファイルの終わりなら
                                goto EXFILE;//終了
                        }
                }
					srt[n].st = inputc;//文章1のポインタに「,」まで読み込んだ文章を格納
					n++;//コメントを除いて8行
                }
        }
EXFILE:
        FileRead_close(fp);
}
//-----------------------------------------------------------------------------------------------------------------------------
//グラフ
void str_graph()
{
	int i ;
	int col = GetColor(255 , 255 , 255);//色

	for(i=0 ; i < MAX_STR ; i++)
	{
		DrawString(100 , 30+(50*i) , str[i].st , col);
	}

}
大雑把に書きました。

上のコードで、訊きたいことは、ファイル(文字)読み込み&格納はできているか・・・・()

もし、textファイルで100行あったとすると、このやり方はスマートであるか?

グラフ(描画)はあまり気にしないでください

思いつき(少し前のトピックの続きなのですが・・)でDXライブラリもインクルードされてないcppファイルにまとめて書いたので実行はしていません・・・

実行してないのに質問とは変ですが、ご教授お願いします。

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: csv(txt)ファイルから読み込んだ文字の描画

#2

投稿記事 by みけCAT » 12年前

DXライブラリには、ファイルから1行読み出す関数があります。
必ず1行に1個のテキストだけを入れるのなら、こちらのほうが遥かに簡単です。
コメントの処理は、読み込んだテキストの最初の文字が'/'だったらnを増やさない、という処理でできます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

mi_l

Re: csv(txt)ファイルから読み込んだ文字の描画

#3

投稿記事 by mi_l » 12年前

返信ありがとうございます

while文の中を自分なりに変えてみました

コード:

while(1)
		{
                for(int i=0 ; i < MAX_STR ; i++)
				{
                    FileRead_gets(str[i].st , 256 , fp);
                    if(str[i].st==EOF || i == (MAX_STR-1))
					{//ファイルの終わりなら
                            goto EXFILE;//終了
                    }
                }
		}
もしくは、

コード:

while(1)
		{
                for(int i=0 ; i < MAX_STR ; i++)
				{
                    FileRead_gets(inputc , 256 , fp);
                    if(str[i].st==EOF || i == (MAX_STR-1))
					{//ファイルの終わりなら
                            goto EXFILE;//終了
                    }
                }
				str[n].st = inputc;
				n++;

		}
上記二つとも
#define MAX_STR 9 //これは行数+1の意味(そうしないと最後の行が読み込まれる前にgotoに行ってしまう)


このようなやり方でいいのでしょうか?

ご教授お願いします


コメント文はなくなったという設定で・・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: csv(txt)ファイルから読み込んだ文字の描画

#4

投稿記事 by softya(ソフト屋) » 12年前

細かいことを言うと、FileRead_openの戻り値はファイルハンドルであって、FILE構造体のポインタではないのでfpと言う名前は間違いです。
ちなみにファイル終端はFileRead_eof()関数を使ってください。if(str.st==EOF などと言うサンプルは何処にもないはずです。
それとi == (MAX_STR-1)は余分です。

【追記】while(1)いらないのでは? FileRead_gets()は一行読むのであって、一文字読むのではありません。
【付記】MAX_STRと言う名前自体が変えたほうが良いです。

【追記の追記】
あと、こちらもお忘れなく。
「龍神録のタイトル画面の表示と遷移 • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=13346#p106977
ちゃんと終わらせましょう。そうしないと、基本的な処で何度もミスを繰り返すことになります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

mi_l

Re: csv(txt)ファイルから読み込んだ文字の描画

#5

投稿記事 by mi_l » 12年前

ソフト屋さん、返信ありがとうございます。

なんか次に訊きたかったことまで答えてくださりありがとうございます。

while文は必要なのか?ということなのですけど・・・やっぱり要らないですよね!


そして、一応コードを載せます

コード:

//-----------------------------------------
typedef struct
{
    char *st;
}String;
//------------------------------------
String str;
//-----------------------------------
#define MAX_SENTENCE 8//今のところは8行なので・・(コメント文は除く)
//----------------------------------------------------------------------------
memset(str , 0 , sizeof(String)*MAX_STR);//初期化
//--------------------------------------------------------------------------
void load_story()
{
    int fh;//ファイルハンドル
    char fname[256]={"上のテキストファイル"};
 
    fh = FileRead_open(fname);//ファイル読み込み

    if(fh == NULL)
	{//空だったらエラー
            printfDx("read error\n");
            return;
    }
	 for(int i=0 ; i < MAX_SENTENCE ; i++)
    {
        FileRead_gets(str[i].st , 256 , fh);//i番目のstrのポインタに(i行目の)一文を格納

        if(FileRead_eof( fh ) != 0)//ファイルの終わりなら
        {
                goto EXFILE;//終了
        }
    }
    
EXFILE:
        FileRead_close(fp);
}
コメント文「/ここから・・・・・・・・・・・・・・・・・」は消したという設定で

そして、上記コードで私が、出来てほしいこと。
1、ファイルの読み込み
2、1番目のStringのポインタstに読み込んだファイルの1行目の文章を格納、(以下同様に2番目ー>2行目・・・・MAX_SENTENCE-1番目まで)
3、ファイルの最後にいったら閉じてくれる。


ご教授、ご指摘お願いします。

mi_l

Re: csv(txt)ファイルから読み込んだ文字の描画

#6

投稿記事 by mi_l » 12年前

訂正

コード27行目のコメント「//i番目のstrのポインタに(i行目の)一文を格納」

これは「//i番目のstrのポインタに((i+1)行目の)一文を格納」


の間違いです。

non
記事: 1097
登録日時: 15年前

Re: csv(txt)ファイルから読み込んだ文字の描画

#7

投稿記事 by non » 12年前

ファイルハンドラはエラーのとき0を返します。0とNULLは仮に同じ0だとしても、意味が違います。

エラーの時、呼び出し側でなんらかの処理が必要になると思うので
void load_story()
でなく、何か返した方が良いと思います。
non

mi_l

Re: csv(txt)ファイルから読み込んだ文字の描画

#8

投稿記事 by mi_l » 12年前

実行しましたら思った通りに描画しました。


皆様ありがとうございます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: csv(txt)ファイルから読み込んだ文字の描画

#9

投稿記事 by softya(ソフト屋) » 12年前

最終形を投稿してほしのですが。
nonさんの提案は吸収されましたか?
ちなみに、gotoレスに出来ます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

mi_l

Re: csv(txt)ファイルから読み込んだ文字の描画

#10

投稿記事 by mi_l » 12年前

コード:


typedef struct
{
    char st[256];
}string_t;

void load_txt()
{
	int fh;//ファイルハンドル
    char fname[256]={"../dat/csv/sample001.txt"};
 
    fh = FileRead_open(fname);//ファイル読み込み
 
    if(fh == NULL)
    {//空だったらエラー
            printfDx("read errortxt\n");
            return;
    }
     for(int i=0 ; i < MAX_SENTENCE ; i++)
    {
        FileRead_gets(str[i].st , 256 , fh);//i番目のstrのポインタに(i行目の)一文を格納
 
        if(FileRead_eof( fh ) != 0)//ファイルの終わりなら
        {
                goto EXFILE;//終了
        }
    }
    
EXFILE:
        FileRead_close(fh);
}
です。

龍神録のやり方を参考にやっており、特に問題はないので、

EXFILEレスのやり方など、テクニックはとりあえずやりたいことができた後に自分で模索し、またここにトピックを出したいと思っております。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: csv(txt)ファイルから読み込んだ文字の描画

#11

投稿記事 by softya(ソフト屋) » 12年前

nonさんの物が反映されてないですね。後だと忘れるのでやるなら今だと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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