4

だから私は自分の課題のために設計しているカード ゲームのカード データを含むファイルを開いています。基本的に各行には 104 文字が含まれ、各行はカードのデッキに相当します。

を使用してchar ****います

  1. デッキ数
  2. プレイヤー数 (4)
  3. カードの枚数 (13)
  4. カードは のよう9Hに表さ3Dれ、ハートの 9 つとダイヤモンドの 3 つを意味するため、2 文字を使用します。

複数の行を読みたいのですfgets()が、これがうまくいくかどうかわかりません...

forfgetsループはデッキファイルの設定方法です。ヒットしたときに次の行に移動するかどうかを知りたいだけです\n...

    di->cards = (char ****)malloc(sizeof(char***) * di->numDecks);
    for (i = 0; i < di->numDecks; i++) {
        di->cards[i] = (char ***)malloc(sizeof(char**) * 4);
        for (j = 0; j < 4, j++) {
            di->cards[i][j] = (char **)malloc(sizeof(char*) * 13);
            for (k = 0, k < 13, k++) {
                di->cards[i][j][k] = (char *)malloc(sizeof(char) * 3);
            }
        }
    }

    for (i = 0; i < di->numDecks, i++) {
        for (j = 0; j < 13, j++) {
            for (k = 0; k < 4; k++) {
                while ((fgets(cards[i][k][j], 3, di->deckFile)) != NULL);
            }
        }
    }
4

4 に答える 4

5

fgets()多くの場合、次のようにループで呼び出されます。

FILE *fp;
char buf[260];// or char *buf, then use malloc - make index size appropriate length for anticipated line len.
fp = fopen("C:\\somedir\\card.txt", "r");
while(fgets(buf, sizeof(buf), fp)) //where sizeof(buf) is the length of   
                                   //line you anticipate reading in.
{
    //do something with buf here;
    //The input of fgets will be NULL as soon 
    //as its input fp has been fully read, then exit the loop  
}
fclose(fp);  

あなたの声明while((fgets(cards[i][k][j], 3, di->deckFile)) != NULL);
にはいくつかの問題があります.1つは;最後にあります。この 1 行でループするだけで、次の行を読み取る前に、読み取られた行で何もする機会がありません。また、3読みたい行の長さではないでしょうか。3 はカード データを保持するバッファ サイズですが、ファイルから読み取る 行は長くなります。

したがって、これらの点に加えて、コメント内の他のアイデアを検討し、指示に従って変更を加えてください。

[編集] "AS3D4C...(52 cards)" 4 行のファイルを読み取るように変更しました。4 組
のカードに十分なスペースを埋めます。これを使用
して、データを読み取る方法を確認できます。strtok (以前に使用) は、区切り文字がある場合にのみ機能し 長い文字列
の代わりに使用することをお勧めし
お役に立てれば。
(この例では [mc]alloc() を使用していないことに注意してください。

#include <ansi_c.h>
#define FILENAME "C:\\dev\\play\\cards.txt"

int main()
{
    int i, j;    
    FILE *fp;
    char buf[260];// or char *buf, then use malloc - make index size appropriate length for anticipated line len.
    char *cardTok;
    char cards[208][3]; //4 players, 4 decks, each card is 3 bytes (eg. [A|S|\0], they all need a null termination)

    memset(cards, 0, 208*3);

    fp = fopen(FILENAME, "r");
    j = 0;
    while(fgets(buf, sizeof(buf), fp)) //where buf len is initialized at 260   
                                       //and well over the anticipated 104/line, including \n etc.
    {                          //note, fgets() will read up to n-1 characters and place a \0 at the end
                           //but will stop reading sooner if it sees end of line.
        for(i=0;i<52;i++) //i is card number
        {
            cards[i+j][0] = buf[2*i+0]; 
            cards[i+j][1] = buf[2*i+1];
            cards[i+j][2] = 0;
        }
        j+=52;
    }
    fclose(fp);
}  

私のテキストファイルは次のようになりました:

9H3D4SQhKD1H9H3D4SQhKD1H9H3D4SQhKD1H9H3D4SQhKD1H9H3D4SQhKD1H9H3D4SQhKD3D4SQhKD1H9H3D4SQhKDKD1H9H3D4SQhKD
6C9H3D4SQhKD1H9H3D4SQhKD1H9H3D4SQhKD1H9H3D4SQhKD1H9H3D4SQhKD1H9H3D4SQhKD3D4SQhKD1H9H3D4SQhKDKD1H9H3D4SQh
2D9H3D4SQhKD1H9H3D4SQhKD1H9H3D4SQhKD1H9H3D4SQhKD1H9H3D4SQhKD1H9H3D4SQhKD3D4SQhKD1H9H3D4SQhKDKD1H9H3D4SQh
3S9H3D4SQhKD1H9H3D4SQhKD1H9H3D4SQhKD1H9H3D4SQhKD1H1H9H3D4SQhKD1H9H3D4SQhKD3D4SQhKD1H9H3D4SQhKDKD1H9H3D4S
于 2013-10-16T13:56:14.470 に答える
2

ドキュメントによると、

char *fgets( char          *str, int count, FILE          *stream );
char *fgets( char *restrict str, int count, FILE *restrict stream );

指定されたファイル ストリームから最大 count - 1文字数を読み取り、 str. 生成される文字列は常に NULL で終了します。ファイルの終わりが発生した場合、または改行文字が見つかった場合、解析は停止します。この場合、str にはその改行文字が含まれます。

また、

戻り値はNULL失敗時です。

失敗が条件によって引き起こされたEOF場合、標準入力に eof インジケータ (feof() を参照) を追加で設定します。失敗の原因が他のエラーである場合は、stdin にエラー インジケータ (ferror() を参照) を設定します。

また、EOF が原因で取得されたことを確認するためにfeofをチェックします。NULL

于 2013-10-16T13:54:24.453 に答える