将文本文件的数据转换为变量

时间:2013-09-19 13:27:59

标签: c file

我知道我的问题已经被其他人问过了,但是作为C的初学者,

坦率地说,我不理解这些问题的答案。

我目前正在使用Windows,而我的代码是C(我正在使用VS2012)

这是我的文本文件的内容:

Bulwark Fury // Assign this string into player.name
Red Steel // Assign this string into player.title
230 // Assign this string into player.typenclass
21  // Assign this string into player.startstr
2.9  // Assign this string into player.incstr
16  // Assign this string into player.startdex
1.6 // Assign this string into player.incdex
16  // Assign this string into player.startintel
1.7 // Assign this string into player.incintel
44  // Assign this string into player.basemindmg
60  // Assign this string into player.basemaxdmg
1.7 // Assign this string into player.baseattacktime
1.24 // Assign this string into player.basearmor

代码:

typedef struct nodebase
{
    char name[20],title[20],type[15],Class[15];
    int typenclass;
    int startstr;
    double incstr;
    int startdex;
    double incdex;
    int startintel;
    double incintel;
    int basemindmg,basemaxdmg;
    double baseattacktime;
    double basearmor;
    struct nodebase *next;
    struct nodebase *curr;
    struct nodebase *prev;
}herostat;

static void stat_file(const char *file_name, herostat player)
{
    FILE *f = fopen(file_name, "r");// open the specified file
    if (f != NULL)
    {
        int c;
        while ((c = fgetc(f)) != EOF)// read character from file until EOF
        {
            fscanf(f,"%s\n%s\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n",
                    &player.name, &player.title, &player.typenclass,
                    &player.startstr, &player.incstr, &player.startdex,
                    &player.incdex, &player.startintel, &player.incintel,
                    &player.basemindmg, &player.basemaxdmg,
                    &player.baseattacktime, &player.basearmor);
        }
        fclose(f);
    }
}

我尝试运行它并打印变量只是为了确保fscanf运行良好,

但是当印刷的是一些随机数字时......

请帮助!

1 个答案:

答案 0 :(得分:1)

OP的代码有很多问题

  • 最大的问题是尝试阅读" 1.24"进入int。这不仅不起作用,随后在fscanf()中使用格式也不会消耗.。解决方案:将浮点数转换为浮点变量。

// int baseattacktime;
double baseattacktime;
// "%d"
"%lf"

  1. c = fgetc(f)很好奇,不需要。

  2. 使用'\n'不会只扫描换行符,而是任何空格。 %d无论如何都会跳过领先的空白区域,因此"%d"" %d"相同。

  3. 当OP正在阅读文本文件时,建议fopen(file_name, "rt")t已添加。

  4. 格式化语句可能会扫描太多字符。使用%19s而不是%s

  5. OP未检查fscanf()结果。

  6. OP希望用空格扫描名称。避免使用不扫描空格的%s。使用%[^\n]

  7. 打破沉重的fscanf()会很有用。

  8. 如果需要阅读多个玩家,则必须为他们分配空间。


  9. 示例代码

    typedef struct nodebase {
        char name[20],title[20],type[15],Class[15];
        int typenclass;
        int startstr;
        doubel incstr;
        int startdex
        double incdex;
        int startintel;
        double incintel;
        double basemindmg,basemaxdmg;  // Assume these 4 need to be FP
        double baseattacktime;
        double basearmor;
        struct nodebase *next;
        struct nodebase *curr;
        struct nodebase *prev;
    }herostat;
    
    
    if (f != NULL) {
      while (13 == fscanf(f," %19[^\n]  %19[^\n]%d" "%d%lf%d" "%lf%d%lf" "%lf%lf%lf%lf",
          &player.name, &player.title, &player.typenclass,
          &player.startstr, &player.incstr, &player.startdex,
          &player.incdex, &player.startintel, &player.incintel,
          &player.basemindmg, &player.basemaxdmg,
          &player.baseattacktime, &player.basearmor);
        // do something with player
        }
      fclose(f);
    }
    
相关问题