2013-02-06 50 views
2

我正試圖做這裏做的事情Read co-ordinates from a txt files using C Program。我試圖輸入數據的格式如下:解析ASCII格式文件中的數據C

f 10 20 21 
f 8 15 11 
. . . . 
f 11 12 25 

我點結構唯一的區別是,我有一個額外的字符來存儲在第一列的字母(這可能會或可能不會字母f)。我想我要麼聲明我的字符錯誤,要麼我錯誤地在printf中調用它。無論哪種方式,我只讀取第一行,然後我的程序終止。有任何想法嗎 ?

這裏是低於

#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; 

} 
+0

爲什麼使用'char t [1]'而不是簡單的'char t'? –

+0

似乎是熟悉調試器的好時機,如果您在基於linux/unix/etc的系統上,我可以推薦GDB! –

+0

@Fredrik:我推薦DDD –

回答

8

我MWE由於只有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個字符數組,在結構末端,設置你的struct hack這可能不會是你的意圖......一個很好的理由使用的只是char t代替char t[1]

而且這條線:

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

應最後

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

一注..如果你想打印出你在底部打印出的字符,你應該使用n

// 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); } 
0

檢查此

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; 

} 

修改是因爲只有單個字符被讀%s修改爲%c也printf中其不points[i].tpoints[n].t。此外,循環中的限制檢查也被糾正爲n<i