将数据从字符串转换为C中的浮点数组[关闭]

问题描述 投票:0回答:2

我需要帮助以尽可能简单和不占用大量内存的方式转换数据。所以数据在一个看起来像这样的字符串中:

4519.8081,01426.5819
4519.8081,01426.5818
4519.8082,01426.5815
4519.8083,01426.5812

我需要从字符串中转换它,所以我得到了两个浮点数组y和x。数组y应该包含第一列中的值(列用逗号分隔)数组x应该包含第二列中的值。

这将在微控制器上完成,所以我真的需要尽可能的简化!

更新:我以为这是足够的信息,仅供获取功能或如何使用该功能的指针,我很抱歉。

总体目标是记录GPS数据,以便获得几个坐标点,从这些坐标点可以绘制出行进路线。它将在320x240 TFT屏幕上大致可视化。我将ATmega32 MCU与GPS模块,SD卡读卡器和上面提到的屏幕一起使用。

详细说明-我正在以上述格式记录GPS数据。数据被记录到txt文件中

4519.8081,01426.5819
4519.8081,01426.5818
4519.8082,01426.5815
4519.8083,01426.5812

每一行都是经度和纬度的一个记录点。4519.8081,01426.5819实际上是45°19.8081'。 14°26.5819'

将一定数量的点记录到SD卡后,我已经存储了数据(尚未定义确切的数目,但是由于内存限制,它将是有限的数目。

[此时,我需要将我拥有的数据转换成两个数组,这些数组将用作在显示器上绘制这些点并在它们之间绘制路径的坐标。

因此,如果我有一个带有坐标的数组X [n]和数组Y [n],我会执行以下操作:

for (int i=0; i<n-1; i++){
    display.drawLine(x[i], y[i], x[i+1], y[i+1])
}

这将遍历数组并从坐标绘制路径。

现在,我知道坐标必须在320x240范围内,因为那是我显示器的分辨率。这就是为什么我不能只传递浮点数(如果我什至可以得到它们的原因!),但我需要首先对数组进行一些计算。

但是总的来说,对于初学者来说,我只需要将字符串中的值放入浮点数组中,例如

x[] = {4519.8081, 4519.8081, 4519.8082, 4519.8083}
y[] = {1426.5819, 1426.5818, 1426.5815, 1426.5812}

[如果有更好的方法来满足我的需要,请随时发表评论。我希望有足够的信息可以使我的问题不受阻碍。预先感谢!

c memory data-conversion
2个回答
1
投票

首先创建数据文件的依据

cat > data.txt <<EOF1
> 4519.8081,01426.5819
> 4519.8081,01426.5818
> 4519.8082,01426.5815
> 4519.8083,01426.5812
> EOF1

然后创建以下C文件

#include <stdio.h>
#define NUM_ITEMS 10

int main() {

    float y[NUM_ITEMS], x[NUM_ITEMS];
    int i = 0;

    while (scanf("%f,%f\n", &y[i], &x[i]) > 0) i++;

    while (i>0) {
        i--;
        printf("%f %f\n", y[i], x[i]);
    }

    return 0;
}

编译后,执行

./a.out < data.txt

程序以相反的顺序创建并打印浮点数组(对应于y和x坐标)。


0
投票

我会做这样的事情:

char *input_string = "..."; // Assume properly null terminated.
float y[N]; // Assume some maximum capacity or if N known.
float x[N]; // Probably allocated using malloc here if N large
float num;
int ind = 0;
while (1) {
    // Assume the string does not start with a new line.
    int n_read = sscanf(input_string, "%f%f", &y[ind], &x[ind]);
    if (n_read != 2) {
        // EOF or bad read
        break;
    }

    ind++;

    if (ind >= N) {
       // Too many floats to fit in array.
       break;
    }

    // Move past the next newline.
    input_string = strchr(input_string, '\n');
    if (input_string == NULL) {
        break;
    }

    input_string++;
}

未经测试,不是很干净,但足以让您入门。同样要记住,正如“风向标”所指出的那样,浮点数不能完全代表所有值。也许您可以根据使用情况考虑定点。

如果您不知道字符串中的行数并且不想具有最大的数组长度,则可以预扫描字符串,然后在以后分配所需大小的数组。

© www.soinside.com 2019 - 2024. All rights reserved.