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

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

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

#1

投稿記事 by 青マグロ » 14年前

 はじめまして、青マグロと言う者です。
 最近“新・ゲームプログラミングの館”を読んでプログラミングを始めた初心者なのですが、件名の事で悩んでいます。

 一度「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;
}

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

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

#2

投稿記事 by h2so5 » 14年前

txtNameにCSVファイルの名前が入っていることは確認できたのでしょうか?

青マグロ

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

#3

投稿記事 by 青マグロ » 14年前

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

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

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

box
記事: 2002
登録日時: 15年前

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

#4

投稿記事 by box » 14年前

青マグロ さんが書きました:

コード:

	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ファイルから読み込んだ文字で別のファイルを開く方法

#5

投稿記事 by 青マグロ » 14年前

 えーと、自分の解釈でですが、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;
			}
		}
	}
 生憎、自分の解釈がアレなので、実際に動くプログラムにはなっておりませんが……。どうすればいいでしょう?

box
記事: 2002
登録日時: 15年前

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

#6

投稿記事 by box » 14年前

とりあえず、私のNo.4の投稿は忘れてくださってかまわないかもしれません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 15年前

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

#7

投稿記事 by box » 14年前

問題は別のところにあって、
青マグロ さんが書きました:

コード:

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

box
記事: 2002
登録日時: 15年前

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

#8

投稿記事 by box » 14年前

根本的な問題は全く別のところにあるようです。
青マグロ さんが書きました:

コード:

	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);
これだけでじゅうぶんではないか、という気もします。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

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

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

#9

投稿記事 by ISLe » 14年前

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

青マグロ

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

#10

投稿記事 by 青マグロ » 14年前

 重ねてご返答ありがとうございます!

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

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

閉鎖

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