扫描C

时间:2017-11-22 13:24:35

标签: c linux

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

  1. 我不知道文件中有多少个点,但如果我将struct数组留空,则会出错。有一种方法可以在不定义最大数量的情况下执行此操作吗?

  2. 我对指针的使用是否正常?我不是很有才华。

  3. 我认为导致分段错误的原因是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
    

2 个答案:

答案 0 :(得分:1)

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

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

答案 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;
}