gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:18:45 25 4
gpt4 key购买 nike

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

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

最佳答案

您将每行数据读入同一个缓冲区,因此最后一行会覆盖所有之前的行。您将不得不通过某种方式或其他方式为每一行分配空间 - 使用 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 行。它在每行的末尾切换换行符(除非一行被拆分,在这种情况下它会切换两行中第一行拆分之前的最后一个字符)。它使用当前时间为随机数生成器播种。您只需要文件中的相邻行,这似乎很奇怪。

关于c - 从文件中读取并存储在数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4237084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com