我试图从文件中扫描一些坐标[X,Y,Z],但总是作为分段错误返回。所以,我要提出一些问题:
我不知道文件中有多少个点,但如果我将struct数组留空,则会出错。有一种方法可以在不定义最大数量的情况下执行此操作吗?
我对指针的使用是否正常?我不是很有才华。
我认为导致分段错误的原因是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
答案 0 :(得分:1)
你有一个非常大的数组声明为局部变量:
struct points cart1[MAX];
数组中有20000个元素,每个数组元素(假设int
和float
每个占用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;
}
答案 1 :(得分:0)
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define MAX 20000
struct point { /* structure for *one* point */
int n;
float x;
float y;
float z;
};
int main (void){
FILE *f1;
int ii;
char *name="point_cloud1.txt";
struct point points[MAX]; /* array of MAX structures, for MAX points */
f1 = fopen(name, "r");
if (f1 == NULL){ /* diagnostics to stderr, add relevant detail, such as the filename */
fprintf(stderr, "Error Reading File:%s\n", name);
exit (0);
}
for(ii = 0; ii < MAX ; ii++){ /*loop-sanity: test the array-bounds where you increment it */
int ret;
ret = fscanf(f1, "%f%f%f", &points[ii].x, &points[ii].y, &points[ii].z); /* use the return value */
if(ret<3) {
if( !feof(f1)) fprintf(stderr, "Reading %s failed at %d\n", name, ii);
break;
}
points[ii].n = ii+1;
}
if (ii == MAX && !feof(f1)) {
fprintf(stderr, "Reading %s : array may be incomplete\n", name);
}
fclose(f1);
printf("Number: %d coord0: %f, %f, %f\n", ii, points[0].x, points[0].y, points[0].z);
return 0;
}