gpt4 book ai didi

c - 从 C 文件中扫描数字

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:37:19 26 4
gpt4 key购买 nike

我试图从文件中扫描一些坐标 [X, Y, Z],但总是返回段错误。所以,我有一些问题要提出:

  1. 我不知道文件中有多少点,但如果我将结构数组留空,就会出现错误。有没有办法在不定义最大数量的情况下做到这一点?

  2. 我可以使用指针吗?我对他们不是很有天赋。

我认为导致段错误的是 fscanf,但我无法修复它

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define MAX 20000

FILE *f1;

struct points{
int n;
float x[MAX];
float y[MAX];
float z[MAX];
};

int main (){

int i;
struct points cart1[MAX];
f1 = fopen("point_cloud1.txt", "r");
if (f1 == NULL){
printf("Error Reading File\n");
exit (0);
}
for(i = 0; !feof(f1); i++){
fscanf(f1, "%f%f%f", &cart1[i].x[i], &cart1[i].y[i], &cart1[i].z[i]);
}
(*cart1).n = i+1;
printf("\nNumber: %d coord1: %f, %f, %f\n", (*cart1).n, (*cart1).x[0], (*cart1).y[0], (*cart1).z[0]);

fclose(f1);

return 0;
}

文件的开头是这样的:

2.84838 -1.21024 -0.829256
7.09443 -3.01579 0.134558
3.31221 -1.40868 -0.830969
7.09813 -3.01883 0.404243
4.05924 -1.72723 -0.857496

最佳答案

你有一个声明为局部变量的非常大的数组:

struct points cart1[MAX];

数组有20000个元素,每个数组元素为(假设intfloat各占4个字节)4 + 4 * 20000 + 4 * 20000 + 4 * 20000 = 240004 字节,总大小为 4,800,080,000 (4.8 GB)。即使作为一个全局变量,它也是巨大的。作为在大多数实现中位于堆栈中的本地,这很容易超过堆栈大小,从而导致核心转储。

您不需要这些结构的数组,只需要一个。然后你像这样使用它:

int main (){

int i, r;
struct points cart1;
f1 = fopen("point_cloud1.txt", "r");
if (f1 == NULL){
printf("Error Reading File\n");
exit (0);
}
for(i = 0, r = 3; r == 3; i++){
r = fscanf(f1, "%f%f%f", &cart1.x[i], &cart1.y[i], &cart1.z[i]);
}
cart1.n = i+1;
printf("\nNumber: %d coord1: %f, %f, %f\n", cart1.n, cart1.x[0], cart1.y[0], cart1.z[0]);

fclose(f1);

return 0;
}

此外,don't use feof

关于c - 从 C 文件中扫描数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47435877/

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