我有一个名为
的文件“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;
}
答案 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;
}