gpt4 book ai didi

c - 从 .txt 文件中读取一行并将其拆分为 float

转载 作者:太空宇宙 更新时间:2023-11-04 08:14:05 24 4
gpt4 key购买 nike

我有一个包含未知(每次)行数的 .txt 文件。每行有 4 个由空格字符分隔的 float 。

我的问题是我不知道如何将每行中的每个 float 与其他 float 分开并将其放在矩阵的正确位置。

这是我到目前为止完成的代码(它第一次遍历每一行,以便我知道声明矩阵的行数,但它只返回四个值中的第一个):

#include <stdio.h>

FILE *fr;

main () {

float time, xaxis, yaxis, zaxis;
char line[40];
int n = 0;

fr = fopen ("walk-after-excel.txt", "r");

while (fgets (line, 80, fr) != NULL) {
n++;
}
rewind (fr);
printf ("%u", n);
float values[n][4];
int i;
for (i = 0; i < n; i++) {
values[i][0] = 0;
values[i][1] = 0;
values[i][2] = 0;
values[i][3] = 0;
}
while (fgets (line, 80, fr) != NULL) {
sscanf (line, "%f", &time);
printf ("%f\n", time);
}
for (i = 0; i < n; i++) {
printf ("%f, %f, %f, %f \n", values[i][0], values[i][1], values[i][2],
values[i][3]);
}
printf ("%u", n);
fclose (fr);
}

任何帮助将不胜感激。

最佳答案

这里有几个问题:

  1. 在现代 C 中,您应该始终为函数指定返回类型,包括 main。这意味着您应该使用 int main(void) { ... }
  2. 您指定了 40 字节的缓冲区大小,但是您告诉 fgets 您的缓冲区是 80 字节,这是一个巨大的禁忌。您绝不能向函数指定您的缓冲区比实际大,否则您将遇到缓冲区溢出(这在现实世界中可能成为可利用的安全漏洞)。因为你使用的是数组类型,所以你可以简单地将sizeof line传递给fgets,然后改变line的大小也没关系code>,它将始终将正确的值传递给 fgets
  3. 您只扫描每行的第一个变量,这就是为什么您只看到每行的第一个值。
  4. 您要声明一个 VLA(可变长度数组)。这些很有用,但在大多数(如果不是全部)实现中,VLA 会占用有限的堆栈空间。如果您尝试声明一个太大的 VLA,它可能会使您的应用程序崩溃。解决这个问题的方法是使用 malloccalloc . calloc 类似于 malloc,只是它会自动为您清零分配的内存。
  5. 您的 fr 变量不需要是全局的。

由于文件的每一行代表一个“记录”,您可以声明一个结构,如下所示:

struct record
{
float time;
float xaxis;
float yaxis;
float zaxis;
};

此外,由于文件中有未知数量的记录,至少有两种方法可以分配足够的内存来容纳所有记录。一种是先统计文件中的所有行数,然后根据行数分配内存。这样做的好处是,您可以准确分配所需的正确内存量,但需要读取文件两次。另一种方法是分配足够的内存来保存适当数量的记录,然后在发现内存分配不够大时“增长”该内存分配。这样做的好处是您只需要读取文件一次,但最终可能会浪费内存。

您已经在使用“先计算记录数,再分配”方法,因此我们只需要解决上述问题。

#include<stdio.h>

struct record
{
float time;
float xaxis;
float yaxis;
float zaxis;
};

int main(void)
{
FILE *fr;
char line[80];
int n = 0;

fr = fopen ("walk-after-excel.txt","r");
if (fr == NULL)
{
printf("Couldn't open file!\n");
return 1;
}

while(fgets(line, sizeof line, fr) != NULL)
{
n++;
}
rewind(fr);
printf("%d",n); // use %d for int types

struct record *records = calloc(n, sizeof(struct record));

for (int i = 0; i < n; i++)
{
fgets(line, sizeof line, fr);

sscanf(line, "%f %f %f %f", &records[i].time, &records[i].xaxis, &records[i].yaxis, &records[i].zaxis);
}

// records now contains all the data in the file!

// to access the 5th line's xaxis value, use:
printf("%f\n", records[4].xaxis);
// (remember that arrays in C are 0-based)

// when you are done, free the memory allocated by malloc/calloc with free()

free(records);

fclose(fr);
}

关于c - 从 .txt 文件中读取一行并将其拆分为 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36852541/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com