【问题标题】:using fscanf to read in a integer from a file使用 fscanf 从文件中读取整数
【发布时间】:2010-07-30 16:40:01
【问题描述】:

gcc 4.4.4 c89

我有以下文件,其中包含姓名、年龄和性别。我正在努力阅读这个时代。

"Bloggs, Joe" 34 M

我可以成功打开文件:

fp = fopen("input.txt", "r");
if(fp == NULL) {
    fprintf(stderr, "Failed to open file [ %s ]\n", strerror(errno));
    return 1;
}

我在 34 岁时尝试阅读。

int age = 0;
int result = 0;
result = fscanf(fp, "%d", &age);

但是,当我尝试打印结果时,我的年龄和结果总是为零。

非常感谢您的任何建议,

【问题讨论】:

    标签: c


    【解决方案1】:

    您没有做任何事情来跳过名称,因此它正在查看该文本,尝试将其转换为 int 并失败,因此返回值为 0(0 次转换成功)和变量中的值保持不变。您需要添加代码以跳过名称,然后读取年龄:

    fscanf(fp, "%*c%*[^\"]\" %d", &age);
    

    最初的"%c" 读取最初的报价。 "%[^\"]\" 读取字符直到(包括)下一个引号。在这两种情况下,“*”表示该值将被读取但不会存储在任何地方。之后,我们可以使用“%d”读取数字。

    【讨论】:

      【解决方案2】:

      字符串的格式不只是一个数字。如果您只想阅读年龄,请包含标题并将以下内容放在您的 fscanf 语句上方。

      int ch=0;
      while(((ch=fgetc(stream)))!=EOF && !isdigit(ch)){}
      ungetc(ch,stream);
      

      【讨论】:

      • 要正常工作,您需要将ch 设为int,而不是char,并且您需要将while 循环更改为:while (EOF != (ch=fgetc(stream)) && !isdigit((unsigned char)ch))
      • 错误代码。永远不要将fgetc 的结果存储在char 中,因为您将失去检测EOF 返回的能力。始终使用int。请注意,如果在没有找到任何数字的情况下点击 EOF,您的代码将永远循环。
      猜你喜欢
      • 2017-05-03
      • 2012-07-17
      • 2015-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-20
      • 2014-02-10
      • 1970-01-01
      相关资源
      最近更新 更多