使用结构和动态分配的内存在C中写入文本文件中的所有行

使用结构和动态分配的内存在C中写入文本文件中的所有行,c,arrays,multidimensional-array,C,Arrays,Multidimensional Array,我用C写了一个程序来表示一个智力竞赛游戏。每个问题都是文本文件中的一行。我使用结构来表示问题数组。它首先接受一些用户输入,然后计算文件中文本行的数量。然后,在将文件的每一行读入结构之前,它为结构分配了所需的内存量。当我打印出结构中的元素时,它打印出20行错误,而不是文件值。我做错了什么?我还包括了文件中一些行的截图 #包括 #包括 #包括 #包括 #定义文件路径“问题和答案” #定义容量120 类型定义结构 { char*问题; }线条; 智力游戏(智力*难度); int main(){ in

我用C写了一个程序来表示一个智力竞赛游戏。每个问题都是文本文件中的一行。我使用结构来表示问题数组。它首先接受一些用户输入,然后计算文件中文本行的数量。然后,在将文件的每一行读入结构之前,它为结构分配了所需的内存量。当我打印出结构中的元素时,它打印出20行错误,而不是文件值。我做错了什么?我还包括了文件中一些行的截图

#包括
#包括
#包括
#包括
#定义文件路径“问题和答案”
#定义容量120
类型定义结构
{
char*问题;
}线条;
智力游戏(智力*难度);
int main(){
int难度;//在测验的十个部分中设置难度
int numberOfLines=0;//将文件中最初计数的行数设置为零
问题长度;
答案[20];
字符c;
//调用设置难度的设置游戏函数
难度=设置游戏(&难度);
FILE*fPointer=fopen(filepath,“r”);//指向未知文件的地址
//如果文件没有内容,则打印错误并结束程序
如果(fPointer==NULL){
perror(“打开文件时出错”);
返回-1;
}
//从文件中提取字符并存储在字符c中
for(c=getc(fPointer);c!=EOF;c=getc(fPointer)){
if(c=='\n')//如果此字符为换行符,则递增计数
numberOfLines++;
}
numberOfLines=numberOfLines+1;
printf(“测验中的问题数量-%d\n”,numberOfLines);
Lines*Lines=malloc(sizeof(Lines)*numberOfLines);//为问题分配内存
对于(int i=0;i
您必须
fclose(fPointer)然后重新打开,然后再从文件中获取问题

fclose(fPointer);
fPointer = fopen("input.txt", "r");
fscanf
逐字阅读,而不是整行阅读。您应该使用
fgets()
getline()

我在你的代码中看到,你通过
150

int lengthOfQuestion = 150;
因此,我认为,声明结构时更容易(如果需要,可以使用指针):

您应该使用一个循环来存储和增加行数。代码将更具可读性。例如:

char line[150];
lines = malloc(sizeof(Lines));
if(!lines) {// handle the error}
while (fgets(fPointer, sizeof(line), line)) {
    strcpy(lines[numberOfLines].question, line);
    numberOfLines++;
    lines = realloc(lines, sizeof(Lines) * numberOfLines);
    if(!line) {// handle the error}

}

我现在看到,由于流未关闭,我无法访问这些值。如果我数了数行,并按照上面显示的相同循环阅读,这就不会是一个问题。谢谢
typedef struct
{
    char questions[150];
} Lines;
char line[150];
lines = malloc(sizeof(Lines));
if(!lines) {// handle the error}
while (fgets(fPointer, sizeof(line), line)) {
    strcpy(lines[numberOfLines].question, line);
    numberOfLines++;
    lines = realloc(lines, sizeof(Lines) * numberOfLines);
    if(!line) {// handle the error}

}