2014-03-30 94 views
1

我想從一個文件,該文本讀取裏面漂浮,直到新生產線的隨機數:掃描用C

˚F502 601 596 465 464
˚F597 599 600 598
˚F602 591 596 601
˚F588 565 548 260 62 61 595
˚F583 595 61 558 561
˚F237 241 471

在每一行中,有一個f隨後是隨機數量的浮標。我希望能夠在f之後獲得數字並將它們存儲在一系列浮點結構中。如果每條線上有三個浮點數,我寫了解析文本文件的代碼,但現在如果有隨機數量的浮點數(最多13個浮點數),我會指示它執行此操作。基本上我現在有三個花車在每一行代碼如下:

struct faces { 
    float p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12; 
} 

struct faces eFace[100]; 

FILE *fp; 
char buff[128]; 
int fCount = 0; 
fp = fopen("text.txt", "r"); 

if (fp == NULL) 
    printf("Can't open file"); 
else { 
    while (fgets(buff, sizeof(buff), fp) != NULL) { 
     if (buff[0] == 'f') { 
      sscanf(buff, "f %f %f %f", &eFace[fCount].p1, &eFace[fCount].p2, &eFace[fCount].p3); 
      fCount++; 
     } 
    } 
} 
fclose(fp); 

}

什麼是修改我的代碼的最佳方式,以便它需要每一個浮動(最多13輛花車)在「f」之後直到一個新行並將它們存儲在我創建的結構數組中?我很感激任何幫助,如果您需要更多信息,請告訴我!

注:我總是要檢查是否符合一個f開始。

+0

在C++中,你可能想要將一行讀入一個字符串,創建一行'stringstream',然後讀一個字符後跟一個'std :: vectorstream從字串流(並忽略字符串)。 –

+0

抱歉,這僅適用於C語言。我刪除只是刪除標記爲C++ –

+0

在while循環的sscanf(「%F」,...),並檢查什麼sscanf的回報,如果 - 0,那麼你知道你的閱讀是不是成功的,所以你;再或許在下一線) – Ardel

回答

2

既然你有一個上限浮子數量,使用,但不要硬編碼的13

掃描文件兩次,以確定的行數。

使用fgets()閱讀每一行。

使用sscanf()strtod()讀取每個號碼。一定要執行錯誤檢查。

未經測試的代碼如下:

#include <assert.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <float.h> 
#define faces_N 13 

typedef struct faces { 
    float p[faces_N]; 
} faces_T; 

void foo(void) { 
    faces_T *eFace = NULL; 
    size_t Lines = 0; 

    FILE *fp; 
    fp = fopen("text.txt", "r"); 
    if (fp == NULL) 
    printf("Can't open file"); 
    else { 
    char buff[2*(faces_N*(FLT_DIG + 10) + 1 + 1)]; 
    while (fgets(buff, sizeof(buff), fp) != NULL) 
     Lines++; 
    rewind(fp); 
    eFace = malloc(Lines * sizeof(*eFace)); 
    assert(eFace); 

    for (size_t l = 0; l < Lines; l++) { 
     if (fgets(buff, sizeof(buff), fp) != NULL) 
     Handle_IOError(); 
     if (buff[0] != 'f') 
     Handle_FormatError(); 
     size_t f; 
     char *p = &buff[1]; 

     for (f = 0; f < faces_N; f++) { 
     int n; 
     if (sscanf(p, "%f%n", &eFace[l].p[f], &n) != 1) 
      break; 
     p += n; 
     } 
     // TBD what to do with other 
     for (; f < faces_N; f++) { 
     eFace[l].p[f] = 0.0; // Or maybe NaN or save count in eFace 
     } 
    } 
    fclose(fp); 

    // do whatever with eFaces; 

    } 
    free(eFaces); 
} 

buff大小是有爭議的。我喜歡最大預期大小的2倍,並且如果緩衝區已滿,會發出錯誤。

預計爲floatchar的數量應該能夠區分所有float。估計通過" -D.DDDDDDddde-dd",來到1 (space) + 1 (sign) + 1 (.) + FLT_DIG + 3 (see link) + 4 (exponent)。關於打印精度的討論請看鏈接:width specifier to maintain precision of floating-point value

+0

,謝謝!這真的有幫助 –

+0

考慮投票你認爲對你有幫助的所有答案(在這個和其他問題上)。經過一段時間(幾個小時,幾天 - 你的電話)針對你的各種問題,如果能夠很好地解決你的問題,請點擊複選標記,考慮「接受」答案。 (我看你已經接受4爲0) – chux