4

所以我正在打开一个文件,其中包含我正在为我的作业设计的纸牌游戏的纸牌数据,基本上每行包含 104 个字符,每行等于一副纸牌。

我使用的是char ****因为

  1. 甲板数量
  2. 玩家人数 (4)
  3. 卡数 (13)
  4. 卡片表示为9H3D表示红心九和方块三,因此它使用 2 个字符。

我想用来fgets()读取多行,但我不确定这是否有效......

for循环就是deckfile的设置方式,我只想知道fgets当它命中时是否会转到下一行\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);
有几个问题,一个是;最后。它只会在这一行上循环,而不会让您有机会在读取下一行之前对已读取的行执行任何操作。另外,3可能不是您要阅读的行长,是吗?3 是保存卡片数据的缓冲区大小,但从文件中读取的会更长。

因此,除了这些要点之外,请考虑评论中的其他想法,并按照指示进行更改。

[编辑] 修改为读取带有“AS3D4C...(52 张卡片)”4 行的文件
它将为 4 副卡片填充足够的空间。您可以使用它来
查看如何读取数据。strtok (以前使用过)仅在有
分隔符时才有效,如果可以的话,我建议使用而不是
长字符串。希望这可以帮助。
(注意,在这个例子中我没有使用 [mc]alloc()'s。

#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 回答
3
    #include <stdio.h>
    char *fgets(char *s, int size, FILE *stream);

fgets()从流中最多读取一个小于 size 的字符并将它们存储到 s 指向的缓冲区中。EOF 在 a或 a 之后停止阅读newline

请注意:如果newline读取 a ,则将其存储到缓冲区中。终止的空字节 ('\0') 存储在缓冲区中的最后一个字符之后。

当你想比较 line 之前,你需要删除\n之前的空字节。

如果你想读单行。

char line[100]; // here you can use char *line=malloc(100);

fgets(line,sizeof line,file_stream);
printf("%s\n",line);

如果你想阅读多行

char lines[20][100]; // here you can use char **lines=malloc(100);
i=0;
//if you use **lines allocate size for all lines with the loop or else you can allocate size inside loop and then read.
while((fgets(lines[i],SIZE_ALLOCATED_FOR_LINE,file_stream)!=NULL) && (i<20))
    {
    printf("%s\n",line[i++]);
    }
于 2013-10-16T14:08:46.173 回答
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())。如果失败是由其他错误引起的,则在标准输入上设置错误指示符(参见 ferror())。

还要检查feof以确保NULL由于 EOF 而获得

于 2013-10-16T13:54:24.453 回答
0

如果您想获取 fgets 输入并将其全部输入到数组数组或字符串数​​组中,您怎么能这样做。我尝试了不同的方法,但出现了段错误

于 2017-06-04T23:00:20.900 回答