从文件中读取并存储在数组中

我编写了以下程序,从文件中逐行读取并将其存储在单词数组中。 输出应该是数组中的两个随机字。 但令人惊讶的是,单词数组只包含重复读取的最后一个单词。 对出了什么问题的任何帮助?

int main(){ int i = 0; char line_buffer[BUFSIZ]; char* words[20]; FILE *fp = fopen("input.txt", "r"); while (fgets(line_buffer, sizeof(line_buffer), fp)) { //printf("%s", line_buffer); words[i] = line_buffer; i = i + 1; } printf("%d", i); int j = rand()%8; int k = (j+1)%8; printf("%s %s", words[j], words[k]); fclose(fp); return 0; } 

input.txt中

 nematode knowledge empty bottle nevertheless claustrophobia metamorphosis acknowledgement impossibility never gave up 

您将每行数据读入同一缓冲区,因此最后一行会覆盖之前的所有行。 您将不得不通过某种方式或其他方式为每一行分配空间 – 使用malloc() (或可能是strdup() )进行动态内存分配,或使用固定大小的数组(这限制了程序可以使用的数据量)处理安全)。 您还需要处理数据读取中的换行符。

您可以使用fgets()而不使用gets() ; 这是一个100%正确的决定。


 #include  #include  #include  #include  enum { MAXLINES = 30 }; int main(void) { int i = 0; char lines[MAXLINES][BUFSIZ]; FILE *fp = fopen("input.txt", "r"); if (fp == 0) { fprintf(stderr, "failed to open input.txt\n"); exit(1); } while (i < MAXLINES && fgets(lines[i], sizeof(lines[0]), fp)) { lines[i][strlen(lines[i])-1] = '\0'; i = i + 1; } fclose(fp); printf("%d\n", i); srand(time(0)); int j = rand() % i; int k = (j+1) % i; printf("%s %s\n", lines[j], lines[k]); return 0; } 

这将检查文件是否已成功打开,读取完成后立即关闭文件,并通过读取比arrays可容纳的更多行来确保它不会触发堆栈溢出。 它通过过度分配空间浪费了大量空间,因此每条线可能很长(尽管线条通常非常短)。 如果一行比BUFSIZ长,它将被读入行中的几个相邻条目。 它不假设数据文件中有8行。 它会在每一行的末尾触发换行符(除非一行被分割,在这种情况下,它会在两行中的第一行之前分割最后一个字符)。 它使用当前时间为随机数生成器播种。 你只想要文件中的相邻行似乎很奇怪。

 int main(){ int i = 0; int BUFSIZE = 1000; char* words[20]; FILE *fp = fopen("input.txt", "r"); if (fp == 0){ fprintf(stderr, "Error while opening"); exit(1); } words[i] = malloc(BUFSIZE); while (fgets(words[i], BUFSIZE, fp)) { i++; words[i] = malloc(BUFSIZE); } printf("Output: \n"); srand(time(NULL)); int j = rand()%i; int k = (j+1)%i; fflush(stdout); printf("%d - %s %d -%s", j, words[j], k, words[k]); int x; for(x = 0; x 

PS。 检查malloc结果

您反复覆盖line_buffer中的内存。 单词数组只包含指向此变量的指针。

您应该使用多维数组或在运行时分配内存。

顺便说一句:当您向代码传递超过20行时会发生错误…

你用srand初始化随机数发生器了吗? 这里提供了一个解释,以及如何使用它的示例。