Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何读取文件中的数据并将其传递给结构~>;C_C_Struct - Fatal编程技术网

如何读取文件中的数据并将其传递给结构~>;C

如何读取文件中的数据并将其传递给结构~>;C,c,struct,C,Struct,好的。我的主目录中有一个名为“毕业生.txt”的文件。 我有一个查找主目录的可移植程序,我打开了文件进行读取。 文件中的数据如下所示: year,firstName,lastName 我需要从此文件中获取此数据,并将其分离到我的结构中: typedef struct alumnus { int yearGraduated; char firstName[30]; char lastName[30]; } Alumns; 我有一个想法,可能有效,也可能无效: whi

好的。我的主目录中有一个名为“毕业生.txt”的文件。
我有一个查找主目录的可移植程序,我打开了文件进行读取。
文件中的数据如下所示:

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;
}
  • 使用FGET从文件中读取一行
  • 使用字符串标记来分隔各个元素
  • 使用strtok()进行相同的操作。 e、 g

    3.记住strtok()是不可重入的函数,所以存储strtok()的每个函数调用返回的结果

    #包括
    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()
    :PUse
    strtok_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);
    }