C - 从文本文件中获取随机单词

标签 c file scanf

我有一个文本文件,其中包含一个按精确顺序排列的单词列表。 我正在尝试创建一个从该文件返回单词数组的函数。我设法按照与文件相同的顺序检索单词,如下所示:

char *readDict(char *fileName) {

    int i;

    char * lines[100];
    FILE *pf = fopen ("francais.txt", "r");

    if (pf == NULL) {
        printf("Unable to open the file");
    } else {

        for (i = 0; i < 100; i++) {

            lines[i] = malloc(128);

            fscanf(pf, "%s", lines[i]);

            printf("%d: %s\n", i, lines[i]);
        }


        fclose(pf);

        return *lines;
    }

    return "NULL";
}

我的问题是:如何从文本文件中返回一个包含随机单词的数组;不是按照文件的顺序?

文件看起来像这样:

exemple1
exemple2
exemple3
exemple4

最佳答案

Reservoir sampling允许您从不确定大小的流中选择随机数量的元素。像这样的东西可以工作(虽然未经测试):

char **reservoir_sample(const char *filename, int count) {
    FILE *file;
    char **lines;
    char buf[LINE_MAX];
    int i, n;

    file = fopen(filename, "r");
    lines = calloc(count, sizeof(char *));
    for (n = 1; fgets(buf, LINE_MAX, file); n++) {
        if (n <= count) {
            lines[n - 1] = strdup(buf);
        } else {
            i = random() % n;
            if (i < count) {
                free(lines[i]);
                lines[i] = strdup(buf);
            }
        }
    }
    fclose(file);

    return lines;
}

这是“算法 R”:

  • 将前 count 行读入示例数组。
  • 对于后续的每一行,以 count/n 的概率替换样本数组中的一个随机元素,其中 n 是行号。
  • 最后,样本包含一组随机线。 (顺序并不是完全随机的,但您可以通过随机播放来解决这个问题。)

关于C - 从文本文件中获取随机单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43214157/

相关文章:

C程序: Sort a text file with records alphabetical order

c - 如何对文本文件中的所有数字求和?

java - 在尚未完成复制/上传时读取文件内容

c - fscanf 使我的 C 程序崩溃,不知道为什么

用于 C DLL 的 C 静态库 (.lib)

调用特定宏时显示自定义错误字符串

c - 运行时间或新想法

Java BufferedReader 回到文本文件的顶部?

c - sscanf - 如果遇到特定字符则提前停止扫描

c - 尽管有用户输入,为什么我的变量被分配为 0?