prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 12.16

如何读取特定格式的数据文件?
如何读取十个浮点数而不必使用一个费劲的scanf格式
字符串,例如"%f %f %f %f %f %f %f %f %f %f"?
如何将一行中任意数量的字段读取到数组中?


通常,有三种主要的数据行解析方法:

  1. 使用fscanfsscanf配合合适的格式字符串。尽管本节提到了其中的限制(参见问题 12.20),但scanf族函数功能非常强大。虽然处理空格分隔的字段总是最容易的,scanf格式字符串也可以用于更紧凑、面向列的 FORTRAN 风格数据。例如,以下行
    	1234ABC5.678
    
    可以使用"%d%3s%f"来读取。(另请参见问题 12.19 的最后一个示例。)
  2. 使用strtok或等效函数(参见问题 13.6)将行拆分为由空格(或其他分隔符)分隔的字段,然后单独处理每个字段,可能使用像atoiatof这样的函数。(一旦行被拆分,处理字段的代码就非常类似于main()中处理argv数组的传统代码;参见问题 20.3。)这种方法特别适用于将一行中任意数量(即事先未知)的字段读取到数组中。

    这是一个简单的示例,它将一行最多 10 个浮点数(以空格分隔)复制到一个数组中。

    #define MAXARGS 10
    
    char line[] = "1 2.3 4.5e6 789e10";
    char *av[MAXARGS];
    int ac, i;
    double array[MAXARGS];
    
    ac = makeargv(line, av, MAXARGS);
    for(i = 0; i < ac; i++)
    	array[i] = atof(av[i]);
    
    (有关makeargv.)

  3. 的定义,请参见问题 13.6。使用任何方便的指针操作和库例程以 ad-hoc 的方式解析该行。(ANSI 的strtolstrtod函数对于这种风格的解析特别有用,因为它们可以返回一个指针,指示它们停止读取的位置。)这显然是最通用的方法,但也是最困难和最容易出错的:许多 C 程序中最棘手的部分是那些使用大量精巧的小指针来解析字符串的部分。

如果可能,请设计数据文件和输入格式,以便它们不需要晦涩的技巧,而是可以使用更简单的技术(例如 1 和 2)进行解析:这样处理文件将更加令人愉快。


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管