ページ 11

CSVファイルから読み込んだ文字で別のファイルを開く方法

Posted: 2012年4月24日(火) 22:05
by 青マグロ
 はじめまして、青マグロと言う者です。
 最近“新・ゲームプログラミングの館”を読んでプログラミングを始めた初心者なのですが、件名の事で悩んでいます。

 一度「A(仮)」という名前のCSVファイルを開き、そこに書かれている「B(仮)」というファイル名を読み込み、それを使って「B(仮)」のCSVファイルを開くと言う事をしたいのです。
 現状では、「A」という名前のCSVファイルから、「B」というファイル名を読み込むまでは出来ているのですが、何故かその読み込んだ「B」を格納した変数を上手く使えず、「B」のCSVファイルを読み込めずにいます。

 環境としてはOSはWindows Vist、使用言語はC言語、DXライブラリ使用、コンパイラにはVisual C++ 2008を使用しています。

 ここまで出来たのだから、自力で出来た方が自分の為になるとは思っているのですが、どうしても分かりませんでした。お力添えして頂ければ幸いです。

//使用しているファイルの名前と中身
ファイル名:textID.csv
中身:
textID,textの名前
0,sch1_T.csv
1,sch2_T.csv

 ファイル名:sch1_T.csv
中身:
こんばんは
//

コード:


#include "DxLib.h"
#include <stdio.h>
#include <stdlib.h>

#define WIND_WIDE 640	//ウィンドウの横幅
#define WIND_HIGHT 480	//ウィンドウの縦幅

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
	SetGraphMode( WIND_WIDE , WIND_HIGHT ,32);//スクリーンの大きさを設定
	
	FILE *fp,*fl;
	char *name = "textID.csv";
	char txt_buff[256];
	int count=0,i;
	int ID=0;
	char txtName[25];
	int White = GetColor(255,255,255);


	//文章のマップIDとtextの対応
	fp = fopen( name ,"r");
	if(fp==NULL){
		printf("text.csvファイルが開けません");
		exit(1);
	}

	//マップIDとtextとの対応

	for(i=0;i<1;i++)//最初の1行読み飛ばす
		while(fgets(txt_buff,sizeof(txt_buff),fp))
			break;

	while(fgets(txt_buff,sizeof(txt_buff),fp)){
		if(ID = atoi(strtok(txt_buff,","))){
			strcpy(txtName , strtok(NULL,","));
			break;
		}
		count++;
	}
	fclose(fp);

	fl = fopen(txtName,"r");
	if(fl == NULL){
		printf("ERR\n");
		exit(1);
	}
	fclose(fl);


// while( 裏画面を表画面に反映, メッセージ処理, 画面クリア )
	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
		DrawFormatString(10,320,White,"%s",txtName);//\0があると、そこで描写を終了する
	
	}
	DxLib_End(); // DXライブラリ終了処理
	return 0;
}

Re: CSVファイルから読み込んだ文字で別のファイルを開く方法

Posted: 2012年4月24日(火) 22:12
by h2so5
txtNameにCSVファイルの名前が入っていることは確認できたのでしょうか?

Re: CSVファイルから読み込んだ文字で別のファイルを開く方法

Posted: 2012年4月24日(火) 22:20
by 青マグロ
 返信ありがとうございます!

 既に書き込んである44行目から49行目までを/* ~ */を使ってコメント文にし、54行目を使って画面にtxtNameの中身を表示しました。
 そこでは「sch1_T.csv」が出力されていたので問題ない筈です。

 あ、36行目で 「=」が一つしかない間違いがありますが、本来のプログラムでは修復済みです。というか、投稿してから気づきました。もっとちゃんと見るべきでしたね……。失礼しました。

Re: CSVファイルから読み込んだ文字で別のファイルを開く方法

Posted: 2012年4月24日(火) 22:45
by box
青マグロ さんが書きました:

コード:

	while(fgets(txt_buff,sizeof(txt_buff),fp)){
		if(ID = atoi(strtok(txt_buff,","))){
			strcpy(txtName , strtok(NULL,","));
			break;
		}
		count++;
	}
おそらくはstrtok()の実装上の問題のため、
同関数を呼ぶときの第1引数は、今回の場合だと
txt_buff
NULL
NULL
NULL
...
以下ずっとNULL
にする必要があったように思います。

Re: CSVファイルから読み込んだ文字で別のファイルを開く方法

Posted: 2012年4月24日(火) 23:35
by 青マグロ
 えーと、自分の解釈でですが、boxさんの言っているプログラムとは、こんな感じですか?

コード:

	int count =0;
	while(fgets(txt_buff,sizeof(txt_buff),fp)){
		if(count == 0){
			count++;
			if(ID == atoi(strtok(txt_buff,","))){
				strcpy(txtName , strtok(NULL,","));
				break;
			}
		}
		if(count != 0){
                        count++;
			if(ID == atoi(strtok(NULL,","))){
				strcpy(txtName , strtok(NULL,","));
				break;
			}
		}
	}
 生憎、自分の解釈がアレなので、実際に動くプログラムにはなっておりませんが……。どうすればいいでしょう?

Re: CSVファイルから読み込んだ文字で別のファイルを開く方法

Posted: 2012年4月25日(水) 00:12
by box
とりあえず、私のNo.4の投稿は忘れてくださってかまわないかもしれません。

Re: CSVファイルから読み込んだ文字で別のファイルを開く方法

Posted: 2012年4月25日(水) 00:25
by box
問題は別のところにあって、
青マグロ さんが書きました:

コード:

			strcpy(txtName , strtok(NULL,","));
txtNameを取得しようとするとき、csvファイルの行末がカンマ区切りになっていないにもかかわらず
このコードを書いているから、うまくいかないのではないか、という気がします。

Re: CSVファイルから読み込んだ文字で別のファイルを開く方法

Posted: 2012年4月25日(水) 00:51
by box
根本的な問題は全く別のところにあるようです。
青マグロ さんが書きました:

コード:

	while(fgets(txt_buff,sizeof(txt_buff),fp)){
		if(ID = atoi(strtok(txt_buff,","))){
			strcpy(txtName , strtok(NULL,","));
			break;
		}
		count++;
	}
せっかくID=0の行を読んでtxtName[]に"sch1_T.csv"を格納したにもかかわらず、
その内容を使わないまま、
次のID=1の行を読んでtxtName[]に"sch2_T.csv"を格納しています。よって、
青マグロ さんが書きました:

コード:

	fl = fopen(txtName,"r");
この時点でのtxtName[]は"sch2_T.csv"ですから、
"sch1_T.csv"というファイルを読まないのはある意味当然ではないか、と思います。

p.s.
最初の質問のところで、AとかBとかいう抽象的な名前を使わずに、
"sch1_T.csv"というような具体的な名前を挙げて、「このファイルが読めない」という風に書けば、
なおよかったのではないか、という気がします。
それから、
青マグロ さんが書きました:

コード:

    for(i=0;i<1;i++)//最初の1行読み飛ばす
        while(fgets(txt_buff,sizeof(txt_buff),fp))
            break;
1行読み飛ばすだけなら、ループを使わなくても、単に

コード:

    fgets(txt_buff,sizeof(txt_buff),fp);
これだけでじゅうぶんではないか、という気もします。

Re: CSVファイルから読み込んだ文字で別のファイルを開く方法

Posted: 2012年4月25日(水) 03:35
by ISLe
青マグロ さんが書きました: 既に書き込んである44行目から49行目までを/* ~ */を使ってコメント文にし、54行目を使って画面にtxtNameの中身を表示しました。
 そこでは「sch1_T.csv」が出力されていたので問題ない筈です。
txtNameに格納されているのは"sch1_T.csv\n"だと思います。
改行コードが余分なのでファイルが見付からないのです。

Re: CSVファイルから読み込んだ文字で別のファイルを開く方法

Posted: 2012年4月25日(水) 08:41
by 青マグロ
 重ねてご返答ありがとうございます!

 csvファイルの各行の末尾に「,」を付けて見たら上手くtextID.csvからsch1_T.csvを開く事が出来ました! 言われていた通り、文章の末尾に\nがついていたので見つからなかったようです。
 実は言うと別の物でも似た様な事をした居たのですが、こちらは最後が整数だったのでatoi()で変換して\nが自動で破棄されていたから、上手く動いていただけなようですね……。

 その他の部分のプログラムの御指摘もありがとうございます。プログラムは短いに越したことはないですからね。自分の処理能力的にも。
 失礼致しましたー