簡體   English   中英

從文件中讀取並存儲在數組中

[英]Reading from a file and storing in array

我編寫了以下程序,從文件中逐行讀取並將其存儲在單詞數組中。 輸出應該是數組中的兩個隨機字。 但令人驚訝的是,單詞數組只包含重復讀取的最后一個單詞。 對出了什么問題的任何幫助?

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 <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行。 它會在每一行的末尾觸發換行符(除非一行被分割,在這種情況下,它會在兩行中的第一行之前分割最后一個字符)。 它使用當前時間為隨機數生成器播種。 你只想要文件中的相鄰行似乎很奇怪。

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結果

您反復覆蓋line_buffer中的內存。 單詞數組僅包含指向此變量的指針。

您應該使用多維數組或在運行時分配內存。

順便說一下:當你向你的代碼傳遞超過20行時會發生不好的事情......

你用srand初始化隨機數發生器了嗎? 一種解釋,對如何使用它的一個例子可以在這里找到

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM