【问题标题】:read each float numbers from text file and skip the rest on C从文本文件中读取每个浮点数并跳过 C 中的其余部分
【发布时间】:2013-11-07 01:01:28
【问题描述】:

我一直在努力理解 scanf 及其实际工作原理。我有以下文本文件:

this    is  a   test    !
25.0    400.0   400.0   0.0     0.0
20.0    200.0  400.0    3.0 4.0
30.0    50  600.0   1 .0    2.0
50.0    400.0  200.0    1 .0    -2.0
40.0    700.0   700.0   -1 .0   -2.0

基本上,代码应该读取每一行并将它们分配给一个单独的数组(数组 A 从第一列获取浮点数,数组 B 从第二列获取浮点数,依此类推)。我唯一能理解的是如何打开文件进行阅读:

FILE *file = fopen( argv[1], "r" );

但我不知道如何从第 1、2、3 和 4 行提取双精度值。顺便说一下,我使用条件语句跳过了第 1 行。我阅读了以下内容:

while  (fgets(line, sizeof(line), file))
            {
                    if (count < 1)
                    {
                            //printf("%s", line);
                            count++;
                    }
                    else
                    {
                            printf("%s", line);
                    }

            }

这些行正在打印,但再次......不确定如何提取每个单独的数字。帮助将不胜感激。

编辑:选择解决方案

这是我在这个测试应用程序中使用的代码。如答案中所述,文本文件有一些拼写错误,使得扫描数据变得更加困难,需要在运行代码之前对其进行编辑。此外,必须添加“int i = 0”的声明才能在数组上工作。

while  (fgets(line, sizeof(line), file))
            {
                 if( 5 == sscanf(line, "%f%f%f%f%f", &A[i], &B[i], &C[i], &D[i], &E[i]) ) 
                 {
                     i++;
                 } 
                 else 
                 {
                     printf( "Parse failed\n" );

                 }

            }

【问题讨论】:

  • 输入文件中的额外空间可以对其他合理的方法造成多大的影响:)
  • @ryyker 真的很有趣。是否有 C 或其他语言的实现可以以更像人类的方式读取文本文件?我知道 ML 有一种很好的方法可以将列表切成小块,然后通过一个方法调用将它们添加到列表中,但我现在想不出其他任何方法。
  • 今天早上刚看到你的问题,抱歉耽搁了。 是否有 C 或其他语言的实现...。我假设您指的是阅读某些内容并自动识别(并纠正)错字的能力。我不知道是否有这样一种语言可以将其作为本机功能。目前,您只需对可接受的输入格式设置界限(即没有额外的空格、.csv 或空格分隔等),并且您的代码必须对它将接受的输入设置界限(即检查 NULL 或空字符串, 为可接受的数字设置界限等)。

标签: c file-io fgets


【解决方案1】:

类似这样的:

if( 5 == sscanf(line, "%f%f%f%f%f", &A[i], &B[i], &C[i], &D[i], &E[i]) ) {
    /* Do something with values */
} else {
    printf( "Parse failed\n" );
}

i 每增加一条有效数据线。

【讨论】:

  • 就像@ryyker 提到的那样,我必须编辑给我的输入文件。修复之后,上面的代码就可以正常工作了。
【解决方案2】:

在这样的循环中使用strtok()atof(),它将为您提供一个 5 x 10 的数组:(基本上是 5 个数组,每个数组最多可容纳 10 个浮点数)

我在 OP 输入文件中发现了可能是问题的一部分的额外空格?我在第 3 行和第 4 行的输入中删除了额外的空格,即将1 .0 更改为1.0)(而且,当我现在查看 OP 时,我没有看到额外的空格)无论如何,请尝试阅读将文件放入数组中:

25.0    400.0   400.0   0.0     0.0
20.0    200.0  400.0    3.0 4.0
30.0    50  600.0   1.0    2.0
50.0    400.0  200.0    1.0    -2.0
40.0    700.0   700.0   -1.0   -2.0

int main(void)
 {
    char *buf;
    char line[80];
    float A[5][10];//hard-coded to accommodate the input file, change as necessary. 
    FILE *file;
    file = fopen("c:\\dev\\play\\test.txt", "r");
    int i=0, j=0;
    i = -1;
    j = -1;
    while(fgets (line, sizeof(line), file))
    {
        j++;
        buf = strtok(line, " \n\t");
        while(buf)
        {
            i++;
            A[i][j] = atof(buf);
            buf = strtok(NULL, " \n");
        }
        i=-1;
    }
    fclose(file);
 }

输出将是 5 个数组 A[0] 到 A[4],每个数组包含 5 列的内容。

【讨论】:

  • strtok 不是线程安全的。最好使用strtof
  • @paddy - strtok_r()strtof() 在需要时都很有用。我在必要时编写可重入代码。当主要目的是演示一个概念时,这里没有必要,但是谢谢!。
猜你喜欢
  • 1970-01-01
  • 2011-02-15
  • 1970-01-01
  • 2016-08-19
  • 2021-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多