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

raz*_*r35 6 c random

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

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;
}
Run Code Online (Sandbox Code Playgroud)

input.txt中

nematode knowledge
empty bottle
nevertheless
claustrophobia
metamorphosis
acknowledgement
impossibility
never gave up
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 6

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

你得到一些使用fgets()和不使用的功劳gets(); 这是一个100%正确的决定.


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

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;
}
Run Code Online (Sandbox Code Playgroud)

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