在C中解析ASCII格式文件中的数据

在C中解析ASCII格式文件中的数据,c,parsing,matrix,C,Parsing,Matrix,我正在努力做这里已经做过的事情。我尝试输入的数据采用以下格式: f 10 20 21 f 8 15 11 . . . . f 11 12 25 我的point结构的唯一区别是,我有一个额外的字符来存储第一列中的字母(可能是字母f,也可能不是字母f)。我猜我要么声明我的字符是错误的,要么我在printf中调用它是错误的。无论如何,我只读取第一行,然后我的程序终止。有什么想法吗 下面是我的MWE #define FILEPATHtri "/pathto/grid1DT.txt" #define

我正在努力做这里已经做过的事情。我尝试输入的数据采用以下格式:

f 10 20 21
f 8 15 11
. . .  .
f 11 12 25
我的point结构的唯一区别是,我有一个额外的字符来存储第一列中的字母(可能是字母f,也可能不是字母f)。我猜我要么声明我的字符是错误的,要么我在
printf
中调用它是错误的。无论如何,我只读取第一行,然后我的程序终止。有什么想法吗

下面是我的MWE

#define FILEPATHtri "/pathto/grid1DT.txt"
#define FILEPATHorg "/pathto/grid1.txt"
#define MAX  4000

#include <stdio.h>
#include <stdlib.h>
#include "math.h"

typedef struct
{    
    float x;
    float y;
    float z;
    char t[1];
}Point;

int main(void) {

    Point *points = malloc( MAX * sizeof (Point) ) ;

    FILE *fp ;
    fp = fopen( FILEPATHtri,"r");

int i = 0;

while(fscanf(fp, "%s %f %f %f ", points[i].t, &points[i].x, &points[i].y, &points[i].z ) == 4 )
{
    i++;
}
fclose(fp);

int n;


for (n=0; n<=i; n++){

    printf("%c  %2.5f %2.5f %2.5f \n", points[i].t, points[n].x, points[n].y, points[n].z ); }


    printf("There are i = %i  points in the file \n And I have read n = %i  points ",i,n);

return 0;

}
#定义FILEPATHtri”/pathto/grid1DT.txt
#定义filepathrg“/pathto/grid1.txt”
#定义最大4000
#包括
#包括
#包括“math.h”
类型定义结构
{    
浮动x;
浮动y;
浮动z;
chart[1];
}点;
内部主(空){
点*points=malloc(最大*sizeof(点));
文件*fp;
fp=fopen(FILEPATHtri,“r”);
int i=0;
而(fscanf(fp,“%s%f%f%f”,点[i].t,&点[i].x,&点[i].y,&点[i].z)==4)
{
i++;
}
fclose(fp);
int n;

对于(n=0;n,因为其中只有1个字符,而不是字符串,所以在代码中只使用一个字符:

    char t;
}Point;
然后,当您在中阅读时:

while(fscanf(fp, "%c %f %f %f ", &points[i].t, &points[i].x, &points[i].y, &points[i].z ) == 4 )
{
我要注意的是,在结构的末尾有一个1个字符的数组,这会使您设置一个可能不是您的意图的数组…这是使用
chart
而不是
chart[1]

此外,这一行:

for (n=0; n<=i; n++){
检查这个

  while(fscanf(fp, "%c %f %f %f ", points[i].t, &points[i].x, &points[i].y, &points[i].z ) == 4 )
    {
    i++;
}
fclose(fp);

int n;


for (n=0; n<i; n++){

    printf("%c  %2.5f %2.5f %2.5f \n", points[n].t, points[n].x, points[n].y, points[n].z ); }


    printf("There are i = %i  points in the file \n And I have read n = %i  points ",i,n);
getch();
return 0;

}
while(fscanf(fp、%c%f%f%f)、点[i].t、&points[i].x、&points[i].y、&points[i].z)==4)
{
i++;
}
fclose(fp);
int n;

对于(n=0;nWhy您使用的是
chart[1]
,而不是简单的
chart
?似乎是了解调试器的最佳时机,如果您使用的是基于linux/unix/etc的系统,我可以推荐GDB!@Fredrik:我推荐DDDYou应该检查fp是否有效。
// note your previous code was points[i].t
printf("%c  %f %f %f \n", points[n].t, points[n].x, points[n].y, points[n].z ); }
  while(fscanf(fp, "%c %f %f %f ", points[i].t, &points[i].x, &points[i].y, &points[i].z ) == 4 )
    {
    i++;
}
fclose(fp);

int n;


for (n=0; n<i; n++){

    printf("%c  %2.5f %2.5f %2.5f \n", points[n].t, points[n].x, points[n].y, points[n].z ); }


    printf("There are i = %i  points in the file \n And I have read n = %i  points ",i,n);
getch();
return 0;

}