使用fscanf从文件中读取字符串后读取整数

时间:2016-12-17 22:32:48

标签: c string format scanf format-specifiers

我制作了一个包含以下

的test.txt文件的程序
  

24 Rohit Soni 1997

这是我的代码:

#include <stdio.h>

void main()
{
    FILE *f;
    int no,i;
    char *name;
    f=fopen("test.txt","r");
    fscanf(f,"%d %[^[0-9]]s %d ",&no, name, &i);
    printf("%d %s %d",no, name,i);
    fclose(f);
}

但它没有显示正确的输出。 输出是:

  

24 Rohit Soni 12804

请告诉我该怎么做。为什么在使用fscanf格式说明符从%[获取字符串后不接受整数。

1 个答案:

答案 0 :(得分:3)

您应该从fscanf()测试返回代码;它会告诉你2个值被转换而不是你期望的3个。您应该始终测试fscanf()的返回代码,通常是预期的转换次数,并且很少会测试EOF或0。

问题是扫描集%[^…]不是%s的修饰符,扫描集也会停在第一个],除非紧跟[之后用于常规扫描集或[^用于否定扫描集。因此,您的格式字符串正在寻找一系列数字,而不是数字,也不是[&#39;字符,后跟]s - 并且在输入中找不到]s

你需要:

#include <stdio.h>

int main(void)
{
    const char *filename = "test.txt";
    FILE *f = fopen(filename, "r");
    if (f == 0)
    {
        fprintf(stderr, "Failed to open '%s' for reading\n", filename);
        return 1;
    }
    int no,i;
    char name[128];

    if (fscanf(f, "%d %127[^0-9] %d", &no, name, &i) != 3)
    {
        fprintf(stderr, "Failed to read three values\n");
        return 1;
    }
    printf("%d [%s] %d\n", no, name, i);
    fclose(f);
    return 0;
}

您需要检查fopen()是否有效。错误消息应包含您无法打开的文件名。 (如果您注意命令行参数 - 使用int main(int argc, char **argv) - 您也会在错误消息中报告argv[0]中的程序名称。)您需要为name分配空间而不是使用一个未初始化的指针。 correct return type for main()int - 尽管Microsoft允许void。请注意,输入格式确保没有buffer overflow

我已将[…]中的名称括在输出中,以便您可以看到该名称包含尾随空格。我得到的输出是:

24 [Rohit Soni ] 1997