如何从C中的文本文件中读取和打印随机单词

时间:2014-05-08 14:09:44

标签: c arrays printing assign

我有一个名为

的文件
  

“grwords.txt”

如何将文件分配给数组并从中打印随机字?我的文本文件包含大约540000个单词。这是我的代码:

int main(int argc, char *argv[]) {
    FILE *file;
    int i, random;
    char words[540000][25];
    file = fopen("grwords.txt", "r");
    if (file == NULL){
        printf("The file cannot be opened.\n");
        return 1;
    }
    random = rand();
    fprintf(file, "%lf\n", random);
    fclose(file);
    return 0;
}

4 个答案:

答案 0 :(得分:0)

void ReadFile(char *name)
{
    FILE *file;
    char *buffer;
    unsigned long fileLen;

    //Open file
    file = fopen(name, "rb");
    if (!file)
    {
        fprintf(stderr, "Unable to open file %s", name);
        return;
    }

    //Get file length
    fseek(file, 0, SEEK_END);
    fileLen=ftell(file);
    fseek(file, 0, SEEK_SET);

    //Allocate memory
    buffer=(char *)malloc(fileLen+1);
    if (!buffer)
    {
        fprintf(stderr, "Memory error!");
                                fclose(file);
        return;
    }

    //Read file contents into buffer
    fread(buffer, fileLen, 1, file);
    fclose(file);

    //Do what ever with buffer

    free(buffer);
}

答案 1 :(得分:0)

打开文件。确定其大小。找到0到大小和fseek之间的随机文件偏移量。扫描一个单词并丢弃它,因为我们可能已经跳到一个单词的中间,然后只打印它的一部分。扫描下一个单词并打印出来。关闭文件。

当然我们可能已经跳到了接近文件末尾的位置,因此我们需要在通过倒回文件来读取单词时到达文件的末尾。作为一个角落案例,文件中可能没有任何文字。

如果您的文件大小ig大于RAND_MAX,您必须找到一种方法来组成一个大于该值的随机数,例如:

int pos = (rand() * RAND_MAX + rand()) % size

如果你需要重复打印文件中的随机单词,那么文件搜索显然不是一个好方法。

答案 2 :(得分:0)

如何将文件分配给数组并从中打印随机字?

A) 读取文件一次获取参数:1:字数,2:最长字长(稍后用于内存分配)
B) 为一个字符串数组(例如:char **strings;)分配内存以将文件读入。
(注意:您已选择使用char words[540000][25];,这也可以使用,但不灵活)
C) 使用fopen()fgets()将每个单词读入数组strings
D) 使用srand()rand()生成从0到numWords的伪随机数。
(注意:rand()本身只生成从0到RAND_MAX(32767)的数字。如果需要更大的数字,请使用rand()的组合来生成更大的数字。 E) 使用printf("Random word is %s", strings[randNum]);打印随机数。

您的代码段是一个开始,但您缺少一些关键元素。其中一个显示在这里:

在代码中的这一点:

random = rand();
fprintf(file, "%lf\n", random);
fclose(file);  

您仍然 没有将打开的文件中的单词读入字符串数组words,正如您所说的那样。这应该在最后一节之前完成。这样的事情应该有效:

    #define DELIM "- .,:;//_*&\n"  //or use char DELIM[]="- .,:;//_*&\n"

    //...other code

    char *buf;
    char line[260];
    int cnt=0;

   while(fgets(line, 260, file))
    {
        buf = strtok(line, DELIM);
        while(buf)
        {
            if((strlen(buf) > 0) && (buf[0] != '\t') && (buf[0] != '\n') && (buf[0] != '\0')&& (buf[0] > 0))
            {
                strcpy(words[cnt++], buf);
            }
            buf = strtok(NULL, DELIM);
        }
    }
    //... other code

答案 3 :(得分:0)

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

int main(int argc, char *argv[]) {
    static char words[540000][25];
    FILE *file;
    int i, j;
    size_t cnt, n;
    char word[25];

    srand(time(NULL));
    file = fopen("grwords.txt", "r");
    if (file == NULL){
        printf("The file cannot be opened.\n");
        return 1;
    }
    cnt = 0;
    while(1==fscanf(file, "%24s", word)){
        if(cnt == 540000)
            break;
        strcpy(words[cnt++], word);
    }
    fclose(file);
    n = cnt;
    if(n > RAND_MAX){
        int part;
        size_t random = 0;
        i = n / RAND_MAX;
        part = rand() % (i+1);
        if(part == i){
            j = n % RAND_MAX;
            if(j != 0)
                random = random + RAND_MAX*part + rand() % j;
            else
                random = random + RAND_MAX*(part-1) + rand();
        } else {
            random = random + RAND_MAX*part + rand();
        }
        printf("%s\n", words[random]);
    } else {
        int random = rand() % n;
        printf("%s\n", words[random]);
    }
    return 0;
}