gpt4 book ai didi

c - 使用 fgets() 读取多行。如何转到下一行?

转载 作者:太空狗 更新时间:2023-10-29 15:19:56 25 4
gpt4 key购买 nike

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

我正在使用 char **** 因为

  1. 甲板数量
  2. 玩家数量 (4)
  3. 卡片数量 (13)
  4. 卡片表示为9H3D表示红心9和方 block 3,所以它使用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);
}
}
}

最佳答案

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 是将保存您的卡数据的缓冲区大小,但您从文件中读取的会更长。

所以,除了这些点之外,考虑一下评论中的其他想法,并按照指示进行更改。

[EDIT] 修改为读取带有“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

关于c - 使用 fgets() 读取多行。如何转到下一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19405254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com