gpt4 book ai didi

c - 从 .txt 文件中读取随机行

转载 作者:太空宇宙 更新时间:2023-11-04 08:10:09 25 4
gpt4 key购买 nike

我正在尝试通过从 .txt 文件中读取随机单词来升级我的 Hangman 游戏。问题是,我不知道如何从 .t​​xt 文件中读取随机行。 .txt 文件的每一行都有一个单词。

void ler_palavras()
{
FILE *words;

if ((words = fopen("words.txt", "r")) == NULL) {
printf("Error! opening file");
exit(1);
}

// reads text until newline
fscanf(words,"%[^\n]", word);
fclose(words);
}

最佳答案

如果出于某种原因,您不能将整组行加载到内存中(太大或其他原因),则有一种方法可以从一组流式条目中选择一个随机条目。它不会无限扩展,并且会表现出小的偏差,但这是一个游戏,而不是密码学,所以这不应该成为一个交易破坏者。

逻辑是:

  1. 声明一个缓冲区来保存单词
  2. 打开文件
  3. 对于每一行:
    • 增加一个计数器,指示您所在的线路
    • 生成一个随机的double(例如使用drand48 或您可用的任何PRNG 工具)
    • 如果 1.0/lineno > randval,将当前存储的单词替换为当前行中的单词(因此第一行自动存储,第二行有 50% 的可能性替换它,第三个是 33% 的人可能会这样做,等等)
  4. 当你用完行时,word 中存储的任何内容都是你的选择

假设行数足够小(并且您的 PRNG 生成的 double 的范围足够细粒度),这给出了尽可能接近任何给定行的相等可能性被选中;对于两条线,每条都有 50/50 的镜头,对于三条线,33.33...%,等等。

我现在缺少 C 编译器,但基本代码如下所示:

/* Returns a random line (w/o newline) from the file provided */
char* choose_random_word(const char *filename) {
FILE *f;
size_t lineno = 0;
size_t selectlen;
char selected[256]; /* Arbitrary, make it whatever size makes sense */
char current[256];
selected[0] = '\0'; /* Don't crash if file is empty */

f = fopen(filename, "r"); /* Add your own error checking */
while (fgets(current, sizeof(current), f)) {
if (drand48() < 1.0 / ++lineno) {
strcpy(selected, current);
}
}
fclose(f);
selectlen = strlen(selected);
if (selectlen > 0 && selected[selectlen-1] == '\n') {
selected[selectlen-1] = '\0';
}
return strdup(selected);
}

关于c - 从 .txt 文件中读取随机行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40118509/

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