在C89中将具有多行的文件读入结构中

时间:2017-11-26 12:56:17

标签: c struct c89

我试图读取大约200行的文件,然后将不同的行保存到结构中。结构如下:

struct person_data{
  char name[20];
  char lastname[30];
  int age;
  char country[3]
};

文件中的行设置为:

"Tom HALL"                            32   ENG
"Ryan SMITH"                          24   USA

所以我的问题是我不确定我应该如何读取该文件,并将信息放入结构中。我是如何尝试将文件保存到我的结构中并打印它,但结果是我的计算机上的目录路径和许多奇怪的符号崩溃之前。 我的代码是:

int main(){
FILE *fp;
fp = fopen("person.txt", "r");
person_data *person = malloc(sizeof(struct person_info));
int i = 0;
if(fp != NULL) {
    while ( i < 200 ) {
        fscanf(fp, "%[A-Za-z] %[A-Z] %d %[A-Z]",
               person[i].name,
               person[i].lastname,
               &person[i].age,
               person[i].country);

        i++;
    }
}
else{
    perror(fp);
}
for (i = 0; i < 200; i++) {
    printf("%s %s  %d %s",
           person[i].name,
           person[i].lastname,
           person[i].age,
           person[i].country);

}
fclose(fp);
return 0;
}

我不确定出了什么问题,因此想问一下是否有人知道我做错了什么以及如何解决这个问题。当我运行该程序时,它看起来像这样:

Output

2 个答案:

答案 0 :(得分:1)

如果你需要200个结构,你需要分配200倍的结构

#define NUMBER 200

person_data *person = malloc(NUMBER * sizeof(struct person_info));

或使用calloc(将分配的内存初始化为零 - 在您的情况下不是必需的,但更容易阅读)

person_data *person = calloc(NUMBER, sizeof(struct person_info));
如果你在其中存储3个字符串(由于尾随零),

并且country也需要至少4个字符(@ PeterJ_01注释)。

答案 1 :(得分:1)

首先看看你的malloc并想一想有什么问题?你只为一个结构进行了malloced。所有类型的分配都是相同的。如果您需要分配struct person数组,可以使用以下命令:

struct person_data *person = malloc(number_of_elements * sizeof(struct person_data));

顺便说一下,sizeof(sturct person_info)你没有person_info struct

我测试你的代码并且用这个语句它没有工作fscanf(fp, "%[A-Za-z] %[A-Z] %d %[A-Z]")我无法弄清楚为什么......但我只是把它重写为fscanf(fp, "%s %s %d %s")并且一切正常

perror()中你传递了FILE*,但它预计会发现const char *s

  

perror()函数会在标准错误上生成一条消息   描述在调用系统或库函数期间遇到的最后一个错误。

     

首先(如果s不是NULL且* s不是空字节(&#39; \ 0&#39;)),则打印参数字符串s,   由冒号和空白降低。然后是与errno的当前值对应的错误消息   和一个新线。   最常用的是,参数字符串应包含产生该函数的函数的名称   错误。

并且你需要为字符串大小+ 1,因为最后一个字符是&#39; \ 0&#39 ;; 在您的情况下,国家[3]需要[4];

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct person_data {
    char name[20];
    char lastname[30];
    int age;
   char country[4];
};


int main(){
    FILE *fp;
    fp = fopen("person.txt", "r");
    struct person_data *person = malloc(sizeof(struct person_data) * 4);
    int i = 0; 
    if(fp != NULL) {
         while ( i < 4 ) {
           fscanf(fp, "%s %s %d %s",
                person[i].name,
                person[i].lastname,
                &person[i].age,
                person[i].country);
                i++;
        }
    }
    else{
      perror("FP ERROR: ");
    }
    for (i = 0; i < 4; i++) {
        printf("%-8s %-10s  %-10d %-10s\n",
        person[i].name,
        person[i].lastname,
        person[i].age,
        person[i].country);

   }
   fclose(fp);
   return 0;
}

我在我的person.txt中尝试了四个人并且它有效。并打印出来:

"Tom     HALL"       32    ENG  
"Ryan    SMITH"      24    USA  
"Hal     Al"         25    UKR  
"Peter   Peters"     99    ENG