如何在文本文件

时间:2015-07-14 10:50:12

标签: c parsing text

  

2.01; 0.441726296835717; -0.564010125045376; -0.416244141468842; -0.559920773166141; 1; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;

     

2.025; 0.441775420652974; -0.563994918440088; -0.416232918868251; -0.55990567681625; 1; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;

     

2.04; 0.441888754828675; -0.563983772823187; -0.416224693310709; -0.55983357975964; 1; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;

     

2.055; 0.441968179548186; -0.563946209146259; -0.416242015187121; -0.559795843365589; 1; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;

     

2.07; 0.442017290067744; -0.563930996016906; -0.416230786556594; -0.55978074219736; 1; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;

上面的文字是我一直在努力的数据。这些是5个句子(实际上更多),由21个数字组成,并用分号(;)分隔。我只想从第2到第5个数字中提取4个数字,这些数字以长数字显示。

我尝试过解析,但每个分段的数字都必须分配给不同的变量,以便我可以添加一些计算过程。我真的希望我能得到一些提示,即使它很广泛。使用的语言是C。

1 个答案:

答案 0 :(得分:1)

我说C很烦人,因为在逐行浏览文本文件时你不得不担心缓冲区大小,而且因为它没有分割功能。但是,它具有strtok(),可用于循环在分隔符处分割字符串时获得的标记。下面的代码实现了一个函数,该函数接受一串以分号分隔的双精度数并将它们读入一个传递的double数组(使用atof()转换为double)。你也可以传递一个起始索引(从0开始)和数字len,以获取双倍数。没有真正的错误检查,虽然如果你在抢夺len双打之前用完了令牌,它不会崩溃。包括一个简单的驱动程序功能,它在上面给出的第一行中进行了硬连接:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

void get_doubles(char* line, int start, int len, double* nums);

int main(void){
    char  test_string[] = "2.01; 0.441726296835717; -0.564010125045376; -0.416244141468842; -0.559920773166141; 1; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;";
    int i;
    double my_nums[4];

    get_doubles(test_string, 1, 4, my_nums);
    for(i = 0; i < 4; i++){
        printf("Number %d: %f\n",i+1,my_nums[i]);
    }
    return 0;
}

void get_doubles(char* line, int start, int len, double* nums){
    char* token;
    char delim[] = ";";
    int i,j;
    j = start + len;

    token = strtok(line, delim);
    for(i = 0; i < j && token != NULL; i++){
        if(start <= i){
            nums[i-start] = atof(token);
        }
        token = strtok(NULL,delim);
    }
}

输出:

Number 1: 0.441726
Number 2: -0.564010
Number 3: -0.416244
Number 4: -0.559921

(顺便说一下 - 你没有看到精确度的损失,因为printf默认为打印双打的6位小数)