[英]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.