我是C编程的新手。我需要在第一行之后从文件中读取数据,我需要将这些内容放入struct中。我尝试了一些东西,但它没有用。它在第二行之后读取内容并且它不读取字符串。我该如何解决这个问题?
这是我的代码,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
char *word;
char *clue;
int x;
int y;
char direction;
int f;
} Word_t;
Word_t* loadTextFile(FILE* myFile, int wNumbers){
char line[100];
Word_t *temp;
temp = malloc(wNumbers*sizeof(Word_t));
int i = 0;
int j= 0;
int status;
while (status != EOF) {
if (fgets(line, sizeof (line), myFile)) {
status = fscanf(myFile,"%c %d %d %s %s", &temp[i].direction, &temp[i].x, &temp[i].y, temp[i].word, temp[i].clue);
i++;
}
}
}
int main(){
Word_t *elements;
char filename[256];
FILE * fp;
int rowCount, colCount, wordsCount;
printf("Enter the name of text file:");
scanf("%s", filename);
fp = fopen(filename,"r");
if(!fp)
{
fputs("fopen failed! Exiting...\n", stderr);
exit(-1);
}
int status;
status = fscanf(fp, "%d %d %d ", &rowCount, &colCount, &wordsCount);
printf("Game is %d rows x %d cols with %d words\n", rowCount, colCount, wordsCount);
elements = malloc(wordsCount*sizeof(Word_t));
loadTextFile(fp, wordsCount);
}
以下是示例文件
5 5 7
H 1 1 MILK White liquid produced by the mammals
H 2 1 IN Used to indicate inclusion within space, a place, or limits
H 3 3 BUS A road vehicle designed to carry many passengers
H 5 3 DAN The name of a famous author whose surname is Brown
V 1 1 MIND A set of cognitive faculties, e.g. consciousness, perception, etc.
V 3 3 BAD Opposite of good
V 2 5 ISBN International Standard Book Number
答案 0 :(得分:1)
您的变量status
未初始化,因此您在while (status != EOF)
的第一次迭代中使用了未初始化的变量。我建议将status
初始化为0。
当您致电fgets
时,您正在使用该行的一行文件。消费后,您将从下一行开始阅读。不要在fscanf
之后致电fgets
,而是尝试使用sscanf
。我还将最后一个转换说明符从%s
更改为%[^\n]s
,以便在读取换行符之前将其读取。这是因为您的clue
字符串中包含空格。
if (fgets(line, sizeof (line), myFile)) {
status = sscanf(line,"%c %d %d %s %[^\n]s", &temp[i].direction, &temp[i].x, &temp[i].y, temp[i].word, temp[i].clue);
i++;
}
值status
可用于告诉您sscanf
%s
的{{1}}参数从输入中读取字符串,但您的值sscanf
和temp[i].word
未初始化且未指向已分配的内存。您需要首先使用temp[i].clue
为这些指针分配内存。
你的函数malloc
没有返回任何内容。你忘记归还loadTextFile
了吗?
此外,您应该返回数组中有效项的数量,以便调用者知道有多少项可用。这可以通过更改方法签名以接受指向temp
而不是值的指针,然后将wNumbers
重置为填充的数组元素的数量来实现。您还应检查循环内部以确保不会读取比分配的元素更多的元素,并适当地处理该情况。
答案 1 :(得分:0)
请参阅以下内容: -
elements = malloc(wordsCount*sizeof(Word_t));
您根本没有在任何地方引用上述变量elements
。删除上面的代码行。
您还需要修改以下方法: -
Word_t* loadTextFile(FILE* myFile, int wNumbers){
char line[100];
Word_t *temp;
temp = (Word_t *) malloc(wNumbers * sizeof(Word_t));
int i = 0;
int j= 0;
int status;
while (true) {
if (fgets(line, sizeof (line), myFile)) {
//you need to allocate proper memory for below two variables
temp[i].word = malloc(10);
temp[i].clue = malloc(60);//you need to check how much memory your need for this variable
status = fscanf(myFile,"%c %d %d %s %s", &temp[i].direction, &temp[i].x, &temp[i].y, temp[i].word, temp[i].clue);
i++;
}
else{
break;//end of file
}
}
}