首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将某些信息从文件存储到数据结构

将某些信息从文件存储到数据结构
EN

Stack Overflow用户
提问于 2018-11-29 22:17:55
回答 1查看 41关注 0票数 1

我目前正在学习如何在C中使用数据结构,我需要一些帮助。我应该从.txt文件中获取有关类的信息,并将这些信息存储在数据结构中;但我在这样做时遇到了困难。我也确信我在我的程序中也搞砸了很多其他的事情,所以可以随意地抨击我的程序,告诉我我做错了什么,这样我就可以从我的错误中吸取教训。

以下是我试图存储的一条信息:

代码语言:javascript
运行
复制
M273 Multivariable Calculus :MWF 0900-0950 2

第一部分是课程编号,第二部分是课程名称,第三部分是课程可用的日期和时间,最后一个数字代表你应该在哪一年上这门课(2翻译成大二)。

下面是我的代码:

代码语言:javascript
运行
复制
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define EMAX 250

typedef struct class{
    char *classNumber[EMAX];
    char *className[EMAX];
    char *classTime[EMAX];
    char *classStanding[EMAX];
}class;

void menu(class*info, char buffer[], FILE*file);
void setInformation(class*info, char buffer[], FILE*file);

int main(void)
{
    class info[EMAX];
    char buffer[EMAX];
    File *file;

    setInformation(info, buffer, file);
    menu(info, buffer, file);

return(0);
}

void menu(class*info, char buffer[], FILE*file)
{
    int user_input=0;

    do {
    printf("\nSelect one of the following options: \n");
    printf("1) Print all information about all classes in order of the class number\n");
    printf("5) Quit\n");
    scanf("%d", &user_input);

    if(user_input==1)
    {
        //getInformation(info, buffer, file);
    }
    }while(user_input!=5);
}

void setInformation(class*info, char buffer[], FILE*file)
{
    size_t count = 0;
    char line[50];
    char *token;

    file = fopen("classes.txt", "r");
    while(fgets(line, sizeof(line), file)!=NULL)
    {
        token=strtok(line, " "); //Only gets the course number
        strncpy(info[count].classNumber, token, strlen(token));
        count++;
    }
    fclose(file);
}

如您所知,我只能用这段代码提取课程编号。我倾向于将所有数据存储在一个时间循环中,并且我尝试通过添加另一个令牌来提取更多的信息,以便在到达":“之前立即停止,但我不知道如何让它工作。当我编译它时,我也会收到很多警告,所以我欢迎任何建议来帮助我的垃圾代码。我很感谢你的帮助

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-29 22:33:53

*scanf()很棒:

代码语言:javascript
运行
复制
#include <stdlib.h>
#include <stdio.h>

#define EMAX 250

#define STRING(X) #X
#define STRINGIFY(X) STRING(X)

typedef struct class_tag {
    char classNumber[EMAX + 1];
    char className[EMAX + 1];
    char classTime[EMAX + 1];
    char classStanding[EMAX + 1];
    char foo[EMAX + 1];
} class;

int main(void)
{
    char const *input_filename = "test.txt";
    FILE *input = fopen(input_filename, "r");
    if (!input) {
        fprintf(stderr, "Couldn't open \"%s\" for reading :(\n\n", input_filename);
        return EXIT_FAILURE;
    }

    class c;
    class *classes = NULL;
    size_t classes_size = 0;
    while (fscanf(input, "%"STRINGIFY(EMAX)"s %"STRINGIFY(EMAX)"[^:] %"STRINGIFY(EMAX)"s "
                         "%"STRINGIFY(EMAX)"s %"STRINGIFY(EMAX)"s",
           c.classNumber, c.className, c.classTime, c.classStanding, c.foo) == 5)
    {
        class *tmp = realloc(classes, ++classes_size * sizeof(*classes));
        if (!tmp) {
            fputs("Not enough memory :(\n\n", stderr);
            fclose(input);
            free(classes);
            return EXIT_FAILURE;
        }
        classes = tmp;
        classes[classes_size - 1] = c;
    }

    fclose(input);

    for (size_t i = 0; i < classes_size; ++i)
        printf("%s %s %s %s\n", classes[i].classNumber, classes[i].className, classes[i].classTime, classes[i].classStanding);

    free(classes);
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53548447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档