gpt4 book ai didi

c - 将文件读入包含 C 中枚举的 typedef 结构?

转载 作者:行者123 更新时间:2023-12-04 08:55:33 26 4
gpt4 key购买 nike

我无法将文件读入 typedef struct包括 enum .我是 C 的初学者,所以我真的不知道如何使用枚举读取文件。
我能够读取文件并用简单的代码打印出内容,但我需要读取文件并将行中的每个字符串分配到 typedef 结构中的类型。
输入文件看起来像这样:

random.num year model category
Example:
54 2012 model1 type1
这些是我的代码的相关部分:
typedef enum { type1, type2, type3, type4} category;

typedef struct {
int num;
int year;
char make[MAX_MAKE_CHARS];
category category; //enum from above
}item;

//reading in the file I have this:

int create_db(char *f){

char file_contents[100]; // read the file --> ("r") FILE *f = fopen(f, "r");
// check if file can be used
if(f == NULL){
printf("File not found");
exit(1);
}
int i = 0; item item_array[100];
while(fscanf(f, "%d %d %s %s", &item[i].num, &item[i].year, item[i].make, item[i].category) != EOF){
// can't get past the while look where it says "item[i].category
我收到错误:

format ‘%s’ expects argument of type ‘char *’, but argument 6 has type ‘category * {aka enum *}’


由于我对 C 完全陌生,因此我对如何将文件读入结构感到困惑。我该怎么办 item[i].category ?

最佳答案

不幸的是,枚举是一个仅在代码中有效的符号,并且无法在运行时作为字符串访问该符号。任意 enum变量实际上存储为 整数
但是你可以做一些事情:

  • 定义一个数组 char *包含枚举的符号作为字符串
  • 存储 enum包含在临时字符串中的输入文件中的符号
  • 检查 scanf 的返回值
  • 调用实用函数在字符串常量数组中搜索临时字符串并返回相应的枚举值
  • 如果未找到该字符串,则会引发错误
  • 如果找到字符串,则将枚举值存储在输出结构中

  • 在下面的示例代码中,我省略了您的 while为清楚起见(您将能够根据问题中未描述的要求将其添加回来):
    int tmp_num;
    int tmp_year;
    char tmp_make[100];
    char tmp_category_str[10]; // <-- define the size according to the max enum symbol length

    if(fscanf(f, "%d %d %99s %9s", &tmp_num, &tmp_year, tmp_make, tmp_category_str) == 4)
    {
    int tmp_category;
    if( ( tmp_category = check_enum( tmp_category_str ) ) != -1 )
    {
    Item.num = tmp_num;
    Item.year = tmp_year;
    strcpy( make, tmp_make );
    Item.category = ( category )tmp_category; // The numeric value is stored in the struct
    }
    else
    {
    printf( "Invalid 'category' value!\n" );
    }
    }
    注意:
  • 我期望返回值 fscanf成为 4
  • 我改了make大小为 100。目的是以简单的方式显示格式说明符 %s应包含对 arr_size-1 的限制字符,为了安全
  • check_enum()如果提供不匹配任何枚举符号的奇怪字符串值,将返回 -1

  • 现在,只有 check_enum()缺少实现。只需循环 enumSymbols[]元素搜索输入字符串。
    char* enumSymbols[] = { "type1", "type2", "type3", "type4" };

    int check_enum(char * str)
    {
    int ret = -1;

    if( str )
    {
    for( int i=0; i<(sizeof(enumSymbols)/sizeof(enumSymbols[0])); i++ )
    {
    if( strcmp(enumSymbols[i], str) == 0 )
    {
    ret = i;
    break;
    }
    }
    }

    return ret;
    }
    注:这有效,但您必须保持数组和枚举对齐。为了防止人为对齐错误,解决方案如 this one可以实现。在这个答案中,我解释了如何创建对齐的枚举/结构对,但以相同的方式并使用 preprocessor stringifier operator # 还可以生成对齐的枚举/字符串数组对。

    关于c - 将文件读入包含 C 中枚举的 typedef 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63850112/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com