【问题标题】:Reading from a file and storing in array从文件中读取并存储在数组中
【发布时间】:2010-11-21 08:47:39
【问题描述】:

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

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;
}

输入.txt

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

【问题讨论】:

  • 永远不会放弃你!永远不会......哦,对不起。
  • 我删除了 Python 标签

标签: c random


【解决方案1】:

您将每一行数据读入同一个缓冲区,因此最后一行会覆盖之前的所有行。您将不得不通过某种方式为每一行分配空间-使用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;
}

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

【讨论】:

    【解决方案2】:
    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<i; x++)
           free(words[x]);
     scanf("%d", x);
     fclose(fp);
     return 0;
    }
    

    ps。查看 malloc 结果

    【讨论】:

      【解决方案3】:

      您反复覆盖 line_buffer 中的内存。 words 数组只包含这个变量的指针。

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

      顺便说一句:当您将超过 20 行代码传递给您的代码时,就会发生不好的事情......

      【讨论】:

        【解决方案4】:

        您是否使用srand 初始化随机数生成器?一个解释,以及如何使用它的例子is available here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-03
          • 1970-01-01
          • 1970-01-01
          • 2012-11-22
          • 2013-03-24
          相关资源
          最近更新 更多