从C中的.txt文件中读取Int和Float值的混合

时间:2017-12-02 02:03:04

标签: c

我在这里有这个文本文件:

6 
81.00 
1 
27 
2004 
8 
7.00 
1 
2 
2009 
14 
97.00 
4 
4 
2001 
10 
38.00 
5 
17 
2006 

我试图将所有这些值读入数组。以下是我提出的一些代码:

int a[20], i, m;
FILE *fn;
fn = fopen("test.txt", "r");
m = 0;
i = 0;
while(!feof(fn)){
    for(i = 0; i < 20 ;i+=1){
        fscanf(fn, "%d", &a[i]);
        printf("%d ", a[i]);
    }
    m += 1;
}

此代码正确读取文本文件的第一个值,因为它是一个整数,但然后错误地读取其余值,我假设它是因为文本文件中的第二个值是浮点数。我不确定这是否可能在C中,但如果是,我很确定从浮点行分别读取整数线是可行的。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

查看输入文件,在输入模式重复之前,您有一个int,然后是double(或float)和另外三个int值。您将阅读与输入相匹配。如果您在循环中阅读并intdouble和另外3个int值,则可以正确读取文件中的数据,然后您可以存储或使用但是你喜欢intdoubleint, int, int

关键是将读取循环与输入匹配。

没有什么可以说你不能一次循环读取一个值,直到EOF保持一个计数器(例如用int n = 0;),然后使用一些 whacky逻辑喜欢

if (n) { 
    if (n == 1)      /* read double; n++ */ 
    else if (n == 4) /* read int; n = 0; */ 
) else               /* read int, n++ */`

但这肯定是解决问题的一种奇怪方式。或者您可以利用scanf的数字格式说明符将跳过前导空格(换行符为空格)并在单个循环中读取所有值的事实。

这是一个不那么糟糕的方法的简单例子。然后,您可以在数组中选择所需的任何值并相应地填充数组,例如

#include <stdio.h>

int main (int argc, char **argv) {

    int id, mo, day, year;  /* 4-int values   */
    double val;             /* 1-double value */
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;

    if (!fp) {  /* validate file open for reading */
        fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
        return 1;
    }

    /* read an int, double, int, int, int, use as required */
    while (fscanf (fp, "%d %lf %d %d %d", &id, &val, &mo, &day, &year) == 5)
        printf (" %02d/%02d/%04d  %2d  %5.2f\n", mo, day, year, id, val);

    if (fp != stdin) fclose (fp);   /* close file if not stdin */

    return 0;
}

注意:通常更好的方法是使用fgets然后sscanf来解析缓冲区中的值(允许独立验证读取和解析)。然而,当故意吃线作为空格结束时,fscanf单独可以提供一个优势(唯一的情况之一是真实的)。

示例输入文件

$ cat prodid.txt
6
81.00
1
27
2004
8
7.00
1
2
2009
14
97.00
4
4
2001
10
38.00
5
17
2006

示例使用/输出

以下只是使用通过循环读取每个行程的值的示例:

$ ./bin/rdprod <prodid.txt
 01/27/2004   6  81.00
 01/02/2009   8   7.00
 04/04/2001  14  97.00
 05/17/2006  10  38.00

仔细看看,如果您有任何问题,请告诉我。