我用C语言写了一个程序来表示一个问答游戏。每个问题都是文本文件中的单独一行。我使用一个结构来表示问题的数组。它首先接受一些用户的输入,然后计算文件中文本行的数量。然后,它在将文件中的每一行读入结构之前,分配结构所需的内存量。当我打印出结构中的元素时,它打印出的是20行错误,而不是文件值。我到底做错了什么?我还附上了文件中一些行的截图。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#define filepath "Questions_Answers"
#define CAPACITY 120
typedef struct
{
char* questions;
} Lines;
int setupGame(int *difficulty);
int main() {
int difficulty; //Set difficulty out of ten of the quiz
int numberOfLines = 0; //Set the number of lines counted in the file initially to zero
int question_length;
char answer[20];
char c;
//Calls setup game function which sets the difficulty
difficulty = setupGame(&difficulty);
FILE* fPointer = fopen(filepath, "r"); //Points to the address of a File not yet known
//If the file has no content, print error and end program
if (fPointer == NULL) {
perror("Error opening file");
return -1;
}
// Extract characters from file and store in character c
for (c = getc(fPointer); c != EOF; c = getc(fPointer)) {
if (c == '\n') // Increment count if this character is newline
numberOfLines++;
}
numberOfLines = numberOfLines + 1;
printf("Number of questions in quiz - %d\n", numberOfLines);
Lines *lines = malloc(sizeof(Lines) * numberOfLines); // allocate memory for questions
for (int i = 0; i < numberOfLines; i++) {
int lengthOfQuestion = 150;
lines[i].questions = malloc(sizeof(char) * (lengthOfQuestion + 1));
fscanf(fPointer, "%s", lines[i].questions);
printf("%s\n", lines[i].questions);
}
fclose(fPointer);
for (int i = 0; i < numberOfLines; i++) {
free(lines[i].questions);
}
free(lines);
return 0;
}
你必须 fclose(fPointer);
然后在你想从文件中获取问题之前重新打开。
fclose(fPointer);
fPointer = fopen("input.txt", "r");
fscanf
读取一个字一个字,而不是整行。你应该使用 fgets()
或 getline()
.
我在你的代码中看到,你把所有问题的长度都用 150
int lengthOfQuestion = 150;
所以,我认为,当你声明结构时,会更容易一些(如果你愿意,你可以使用指针)。
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}
}