1

我知道我的问题已经被其他人问过了,但是作为 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 运行良好,

但是当打印的是一些随机数......

请帮忙!

4

1 回答 1

1

OP的代码有很多问题

  • 最大的问题是试图将“1.24”之类的文本读入int. 这不仅不起作用,后续使用 in 格式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. 如果需要读取多个播放器,则必须为它们分配空间。


示例代码

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);
}
于 2013-09-19T15:34:03.847 回答