【问题标题】:C Programming: fgets() function is not reading the values that I think it shouldC 编程:fgets() 函数没有读取我认为它应该读取的值
【发布时间】:2020-10-06 23:25:52
【问题描述】:

我正在尝试打开并读取一个 .txt 文件,其中仅包含 00 到 99 之间的 2 位数字。

目前该文件包含以下数字:05

当我用 fgets() 读取前两个值时,我得到的是 48 和 53,而且我注意到我在那里输入的任何数字,fgets() 抓取的数字都高出 48。虽然我可以像现在这样从数字中减去 48,但我想弄清楚我做错了什么,这样我就不必这样做了。这是我的代码的相关部分:

char buff[3];
FILE *fp;
fp = fopen("savedata/save.txt","r");
fgets(buff, 3, fp);
SampleLevelIndex = (buff[0]-48)*10 + buff[1]-48;
fclose(fp);

【问题讨论】:

  • 48 是字符 '4' 的 ASCII 码。 fgets 不读取数字。它读取字符。为什么不使用fscanf
  • 这能回答你的问题吗? Convert char to int in C and C++
  • 所以我在阅读后尝试将其转换为 int ,但这似乎不起作用。还有其他方法吗?
  • 您不能将数字字符转换为它所代表的数值。查看指向可能的欺骗的链接。
  • @JakeWard 转换与从 ascii 转换为整数不同。 atoi / atol 会做到的

标签: c io fgets


【解决方案1】:

您的文件包含字符“0”和“5”。请注意,“0”的 ASCII 码是 48。

您正在读取字节的值,而不是表示的数字。如果文件中有“A”,则字节为 65。

您的方法适用于手动将数字字符转换为数字(尽管您可能需要进行一些额外的检查,但如果它不包含两个数字,它将中断)。或者你可以使用像atoi() 这样的函数,它将数字字符串转换为数字。

【讨论】:

  • 感谢您的明确答复。我现在将使用 atoi()。
  • 不! atoi 在某些输入上调用未定义的行为。使用 strtol 之类的安全函数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 2010-12-11
  • 1970-01-01
  • 2020-06-09
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多