ページ 11

ファイルの読み込みについて

Posted: 2010年7月23日(金) 15:45
by t@
はじめまして。さっそくですが質問させていただきます

1.カードの名前が入ったファイルからデータを読み取って、それを配列に構造体の中の配列に格納したい。

2.
void frW(){//名前ファイル読み込み関数
    fW = FileRead_open( "name\\Wands.txt" );// ファイルを開く
    while( FileRead_eof( fW ) == 0 )// ファイルの終端が来るまで表示する
    {
        FileRead_gets( str, 22, fW );// 一行読み込み
        c.name[0] = str;//データを格納
        i++;//
     }
    FileRead_close( fW );// ファイルを閉じる
    i = 0;
}
一行ずつ読みこんで、その際に読んだデータをc.nameに格納したいです。

3.c.nameには読み込んだデータだはなく、-125 '・'、-113 '・'のようなデータが入ってしまいます。

4.ファイルから一行ずつでデータを読み込んでc.nameに一つずつ格納したい。

5.学校で習いました。成績は真ん中ぐらいです。

windows Vista Basic
Visual C++ Express Edition
DXライブラリ
を使っています。

読み込んでいるデータファイルも載せます

よろしくお願いします。

追記
全部のソースは長いし、読みづらいと思います;
変数の型を乗せます。

typedef struct{
char name[5][22];
int score[7];
int graph[5][22];
}card;
card c;

int fW,i;
char str[22];

追記
すみません!説明不足でした

カードはタロットで、名前の種類ごとにファイルが用意してあります。
ワンド、カップ、ソード、ペンタクルス、と大アルカナの5種類のファイルがあります。
ここでは一つだけ載せました。
name[5][22]の[5]はカードの種類を表していて、[22]がカードの名前を表しています。
name[0][0]に”ワンドの1”、name[0][1]に”ワンドの2”、name[1][0]に”ソードの1”といったかんじに格納したいです。

すみませんでした

画像

Re:ファイルの読み込みについて

Posted: 2010年7月23日(金) 16:09
by パコネコ
結局DXライブラリはほとんどい変えていない状態なのでいまいち知らないのですが、
>fW = FileRead_open( "name\\Wands.txt" );// ファイルを開く
このオープンも実は知りません。
拡張子?違いますね。え~と、そうだ、モードとかはないんですか?
読み込みようとか、書き込み用とか?

後は読み込みのときに、”%s”とかないんですか?
fscanf文ぐらいしか知りませんが…getsだからいらないのかな?

あと、
/*
FileRead_gets( str, 22, fW );// 一行読み込み
c.name[0] = str;//データを格納
*/
一行読み込んで一文字コピー?に見えるのですが。
気のせいでしょうか?
(それとも勘違い?)
しかも少しずつずれてる…
1行目の1文字目
2行目の2文字目?
みたいに?

Re:ファイルの読み込みについて

Posted: 2010年7月23日(金) 16:14
by やっくん
それぞれの変数の型がよくわからいので、宜しければ全てのソースコードを上げてもらってもよろしいですか??

<追記>

c.nameが構造体のメンバでしょうか。
そうであれば、文字列コピーにはCの標準関数のstrcpy関数を使うとよろしいですよ。
http://www.bohyoh.com/CandCPP/C/Library/strcpy.html

strcpy(c.name, str);
のように使います。
構造体の定義や変数宣言が良くわからないのでこれで正しいかわかりませんが。

>パコネコさん
調べてみましたが、DxLibには読み込み用しかなさそうです(^^;
http://homepage2.nifty.com/natupaji/DxL ... html#R19N1t=

Re:ファイルの読み込みについて

Posted: 2010年7月23日(金) 16:46
by パコネコ
て、ことは
>c.name[0] = str;//データを格納
strcpy(c.name,str);
になるんですか?

Re:ファイルの読み込みについて

Posted: 2010年7月23日(金) 17:37
by やっくん
>t@さん
ソースコード、載せていただきありがとうございます。

>name[0][0]に”ワンドの1”、name[0][1]に”ワンドの2”、name[1][0]に”ソードの1”といったかんじに格納したいです。
char型には配列の要素1つに半角1文字分しか入れることができません。
↓格納されるイメージとしてはこんな感じです。
[0] = 'w';
[1] = 'a';
[2] = 'n';
[3] = 'd';

ですので、まずは構造体の変数宣言を少し変えてみてみましょう。
char name[5][22];

char name[5][14][22]; // [カード種類][数字の種類][文字列格納]
とすると楽です。

[0][0][0]~[0][0][21]までを用いて"ワンドの1"を格納します。

先程、載せたstrcpy関数ですが使い方はご存知でしょうか?

(補足)
char型の補足。
↓この代入は不可能
char moji[2];
moji[0] = 'あ';
moji[1] = 'い';

理由はchar型1個は1バイト分なので、2バイトで表現される全角文字を格納するには配列要素2つ分使います。