如何读取C中大量单词列表中的随机字符串?

时间:2016-11-03 22:41:29

标签: c file io scanf stdio

我正在开发游戏刽子手的基本实现。

我有一个包含最多1000个常用英语单词的文本文件,我想随意选择其中一个作为我游戏中的单词。

我知道我需要使用fopen和fscanf将单词转换成我的程序中的字符串,但是如何选择要读入的字符串呢?

我是否必须将整个列表导入数组,然后从那里选择一个?或者有没有办法可以选择要扫描哪个词?

2 个答案:

答案 0 :(得分:2)

需要阅读所有单词才能选择一个。

你可以寻找单词文件中的随机点,一直向前看,直到你看到换行符(或任何单词分隔),使用fgets()scanf()读取一个单词并关闭文件:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

void random_word(const char *file_name, char *buffer, size_t length) {

    FILE *file = fopen(file_name, "r");

    if (file == NULL) {
        fprintf(stderr, "Can't open %s!\n", file_name);
        exit(EXIT_FAILURE);
    }

    (void) fseek(file, 0L, SEEK_END);
    long size = ftell(file);

    int c = EOF;

    while (c == EOF || fgets(buffer, length, file) == NULL) {
        long offset = random() % size;

        (void) fseek(file, offset, SEEK_SET);

        while ((c = getc(file)) != EOF && c != '\n');
    }

    buffer[strlen(buffer) - 1] = '\0'; // remove trailing \n

    (void) fclose(file);
}


int main() {

    srandom(time(NULL));

    char buffer[1024];

    for (int i = 0; i < 10; i++) {
        random_word("/usr/share/dict/words", buffer, sizeof(buffer));

        (void) puts(buffer);
    }

    return 0;
}

示例

> ./a.out
boloman
disentrance
guanase
decorable
snibbled
redemandable
Cluniac
balneal
turbidimetry
catechistically
> 

此代码不需要复杂也不需要高效,因为它是一种罕见的事件,在处理方面,您选择一个新单词并且它发生在人类时间范围内,而不是高速处理它。

答案 1 :(得分:1)

简单的方法是放入一个数组,然后得到一个随机索引。 更复杂但更有效的是读取每个单词的索引,保存到另一个文件,然后,只读取存储该单词的扇区。 真的,把它放在一个数组中。