我试图读取大约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;
}
我不确定出了什么问题,因此想问一下是否有人知道我做错了什么以及如何解决这个问题。当我运行该程序时,它看起来像这样:
答案 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