gpt4 book ai didi

c - 读取包含单词的 txt 文件的行

转载 作者:行者123 更新时间:2023-11-30 20:33:53 25 4
gpt4 key购买 nike

目前在学校,我正在开发一个类似街机的游戏项目。我有这样的想法,每次我们进入下一个关卡时,都会在该关卡上放置一个随机名称,而不仅仅是“1 级”、“2 级”等......所以我想知道如何使用 fscanf 或 fgets 或类似的东西来做到这一点?我的文本文件包含 70 行不同名称的行。

谢谢了:D

最佳答案

如果每行只有一个名称,则使用 fgets()。

/******************************************************************************************
* This function reads a file line by line putting each line as a C-sting in an array
******************************************************************************************/
void read_names(char **names_table, int *n_names)
{
FILE *fp = fopen(<filename>, "r");

int i = 0;
for(i = 0; i < MAX_N_NAMES; ++i){
char *name = malloc(MAX_NAME_LENGTH);
fgets(name, MAX_NAME_LENGTH, fp);

if(name == NULL)
break;

name_table[i] = name;

}

*n_names = i; // There's a gotcha here

}

这样,您将调用您的函数一次,然后由您决定您的数组应位于何处(在内存中的位置,谁拥有和管理它)。然后我会使用 rand() % n_names 为该级别选择该数组的随机索引。

在你的程序中的某个地方,你应该有

枚举名称参数 { MAX_N_NAMES = 80, MAX_NAME_LENGTH = 20 };(我比 #define 更喜欢这个,因为调试器会向您显示常量的名称。)

这应该可以帮助您开始,您可能想做的一件事是标记您使用过的名称,以免在两个级别中使用它们。我将使用另一个 int 数组(C 没有 bool 值)来完成此操作,您可以在其中将级别标记为已使用。这有一个问题,您必须执行 rand() % n_names 直到找到未使用的名称。

或者您可以将 name_table 洗牌一次并使用 name_table[i] 作为级别 i。

void swap_indices(char **array, int i, int j) 
{
char *tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}

void shuffle(char **array, int length)
{
// Do a bunch of swaps, depending on how much you care about randomness,
// you might want to look up shuffling algorithms or see if some already
// exist that you could use, but if you don't care that much, just
// do a bunch of swaps.
}

最后,我建议使用一个独立的 C 文件(模块)来将这样的结构作为全局变量进行管理。您的 .h 文件可能如下所示(您将其包含在其他文件中,它将允许您访问模块的公共(public)接口(interface))。

#ifndef _LEVEL_NAMES_H_
#define _LEVEL_NAMES_H_

enum NameErrorCodes { ERR_NONE = 0, ERR_FILE, ERR_OTHER};
int names_init(char *filename);
char *get_name();

#endif

那么你的 c 文件可能如下所示:

#include "LevelNames.h"

struct LevelNames{
int n_names;
char * names[MAX_N_NAMES];
};

static struct LevelNames level_names; // static makes this global variable
// accessible only from this file
// It does the same thing for functions

static int read_names(char *filename);
static void swap_indices(char **array, int i, int j);
static void shuffle_names();

/*******************************************************************************
*
*******************************************************************************/
int names_init(char *filename)
{
int err = 0;
err = read_names(filename);
if( err != ERR_NONE )
return err;
shuffle_names();
}

/*******************************************************************************
*
*******************************************************************************/
char *get_name(int level)
{
if(level >= level_names.n_names || level < 0)
return NULL;

return level_names.names[i];
}

/*******************************************************************************
*
*******************************************************************************/
static int read_names(char *filename)
{
FILE *fp = fopen(<filename>, "r");
if( fp == NULL )
return ERR_FILE;

int i;
for(i = 0; i < MAX_N_NAMES; ++i){
char *name = malloc(MAX_NAME_LENGTH);
fgets(name, MAX_NAME_LENGTH, fp);

if(name == NULL)
break;

level_names.names[i] = name;

}

level_names. = i; // There's a gotcha here

return ERR_NONE;
}

/*******************************************************************************
*
*******************************************************************************/
static void swap_indices(char **array, int i, int j)
{
...
}

/*******************************************************************************
*
*******************************************************************************/
static void shuffle_names()
{
...
}

这就是我会做的。并且不要忘记 read_names 中的陷阱。

我想以全局变量的讨论作为结束。您可能像我一样在学校里被告知,永远不应该使用全局变量。这件事情是由很多原因导致的。这些都是很好的理由,您应该听听对您说这些的人的意见。

但是,我有一个模块,其唯一目的是管理名称数组。因此,该模块有一个全局变量是有道理的。此外,该变量必须是静态的,这一点也至关重要。这样,模块的客户端就不会知道您的全局变量(他们不应该知道)。

C 标准库的许多模块都有一个它们管理的静态全局变量。如果您想使用全局变量,因为您不知道如何将某些内容从一个函数传递到另一个函数,那么请弄清楚并且不要使用全局变量。如果您想模仿 C++ 或 Java 中静态类的行为,那么这样做是合法的。

关于c - 读取包含单词的 txt 文件的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43821267/

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