C,从txt文件读入struct

时间:2018-04-11 22:13:01

标签: c

我是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

2 个答案:

答案 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}}参数从输入中读取字符串,但您的值sscanftemp[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
      }
  }   
}