如何读取文件中的数据并将其传递给结构~>;C
好的。我的主目录中有一个名为“毕业生.txt”的文件。如何读取文件中的数据并将其传递给结构~>;C,c,struct,C,Struct,好的。我的主目录中有一个名为“毕业生.txt”的文件。 我有一个查找主目录的可移植程序,我打开了文件进行读取。 文件中的数据如下所示: year,firstName,lastName 我需要从此文件中获取此数据,并将其分离到我的结构中: typedef struct alumnus { int yearGraduated; char firstName[30]; char lastName[30]; } Alumns; 我有一个想法,可能有效,也可能无效: whi
我有一个查找主目录的可移植程序,我打开了文件进行读取。
文件中的数据如下所示:
year,firstName,lastName
我需要从此文件中获取此数据,并将其分离到我的结构中:
typedef struct alumnus {
int yearGraduated;
char firstName[30];
char lastName[30];
} Alumns;
我有一个想法,可能有效,也可能无效:while循环读取文件,使用fgets()获取数据。然后将其复制到结构中。。。但我不知道如何实现这些
很抱歉,如果这听起来像个愚蠢的问题,很可能是这样。下面是一个快速阅读输入的示例,使用
fopen()
、fgets()
和strtok()
以及如何使用正确的格式字符串格式化输出:(此处显示的输出)
编辑以显示将值放入结构中
#include <ansi_c.h>
typedef struct alumnus { //Note "alumnus" is not necessary here, you have Alumns
int yearGraduated; //below that will satisfy naming the typedef struct
char firstName[30];
char lastName[30];
}Alumns;
Alumns a, *pA; //Create copy of struct Alumns to use
#define FILE_LOC "C:\\dev\\play\\file10.txt"
int main(void)
{
FILE *fp;
char *tok;
char input[80];
pA = &a; //initialize struct
fp = fopen(FILE_LOC, "r"); //open file (used #define, change path for your file)
fgets(input, 80, fp);
tok = strtok(input, ", \n"); //You can also call strtok in loop if number of items unknown
pA->yearGraduated= atoi(input); //convert this string in to integer
tok = strtok(NULL, ", \n");
strcpy(pA->firstName, tok); //copy next two strings into name variables
tok = strtok(NULL, ", \n");
strcpy(pA->lastName, tok);
//note the format strings here for int, and char *
printf("age:%d\n First Name: %s\n Last Name: %s\n",
pA->yearGraduated, pA->firstName, pA->lastName);
getchar(); //used so I can see output
fclose(fp);
return 0;
}
#包括
typedef struct alumnus{//注意这里不需要“alumnus”,您有alumnus
int yearDigraded;//下面的值将满足对typedef结构的命名
charfirstname[30];
char lastName[30];
}校友;
校友a,*pA//创建要使用的结构校友副本
#定义文件\u LOC“C:\\dev\\play\\file10.txt”
内部主(空)
{
文件*fp;
char*tok;
字符输入[80];
pA=&a;//初始化结构
fp=fopen(FILE_LOC,“r”);//打开文件(用于定义、更改文件路径)
fgets(输入,80,fp);
tok=strtok(输入,“,\n”);//如果项目数未知,也可以在循环中调用strtok
pA->YearDigraded=atoi(输入);//将此字符串转换为整数
tok=strtok(空,“,\n”);
strcpy(pA->firstName,tok);//将接下来的两个字符串复制到name变量中
tok=strtok(空,“,\n”);
strcpy(pA->lastName,tok);
//注意这里int和char的格式字符串*
printf(“年龄:%d\n名字:%s\n姓氏:%s\n”,
pA->yeargraded,pA->firstName,pA->lastName);
getchar();//用于查看输出
fclose(fp);
返回0;
}
#包括
typedef结构校友{
国际年毕业;
charfirstname[30];
char lastName[30];
}校友;
内部主(空){
校友录1;
文件*fptr;
fptr=fopen(“Test.txt”,“r”);
fscanf(fptr、%d、%s、%s、&REC1.yeargraded、REC1.firstName、REC1.lastName);
printf(“%d,%s,%s”,REC1.yeargraded,REC1.firstName,REC1.lastName);
}
使用dasblinkenlight提示实现。您可能需要了解。复制数据是浪费时间。使结构指针的成员具有一个较大的缓冲区(更好的是,指针可以调整大小,以便在最大行长度上没有固定的上限)。使用fgets将每一行读入大缓冲区,找到逗号并替换为nul字节,然后将每个成员指针设置为nul后面的字符。这不是一个愚蠢的问题,而是一个复杂的问题,因为C无法帮助您避免任何可能的陷阱。如果你想让别人给你的Graduates.txt文件写信,你需要非常小心。如果这不是学习C语言的教育性任务,我强烈建议您使用不同的语言。如果您对这种方法有想法,请尝试一下并展示您的代码。要想解决像这样的问题,很多学习都是要尝试一些事情,亲身体验思维过程、陷阱和随后需要的纠正。@JoachimPileborg你拼错了
strtok_r()
:PUsestrtok_r()
,它是可重入的,而不是黑客。同时将硬编码字符串的大小从150更改为sizeof string
。不要把它命名为“字符串”。将其命名为“line”或“buffer”或“tmp”。。。此外,感谢H2CO3提供更好的功能!!我在fscanf行上遇到了一个错误的访问错误,@“%d”表示%d是int*类型,yearDraduated是int类型,我如何修复它?嗯。。在运行该程序之前,您是否创建了包含1000、Name1、Name2内容的文件“Test.txt”?我知道这是一篇非常古老的文章,但是如果将文件读入这样的结构中,请将文件指针进一步移到文本文件中。从本质上说,为了填充一系列结构,这是否能够在循环中进行预处理?@beckah:是的。您可以在一个循环中填充结构数组。您在哪里使用strtok
拆分行?
FILE *fp;
fp = fopen("path", "r");
char string[150];
char *token;
while(!feof(fp)) {
if (fgets(string,150,fp)) {
printf("%s\n", string);
token=strtok(string,",");
/*Store this token in your struct(your first element) */
}
}
#include <stdio.h>
typedef struct alumnus {
int yearGraduated;
char firstName[30];
char lastName[30];
}Alumns;
int main(void) {
Alumns REC1;
FILE *fptr;
fptr = fopen("Test.txt", "r");
fscanf(fptr, "%d,%s,%s", &REC1.yearGraduated, REC1.firstName, REC1.lastName);
printf("%d, %s, %s", REC1.yearGraduated, REC1.firstName, REC1.lastName);
}