2009-11-14 24 views
2

現在我使用:如何檢索C中的數據而不是整行?

char record[BUFLEN]; 
    if(fgets(record, BUFLEN, fp) != NULL) { 

     /* some code */ 

    } 

擺脫輸入線,如:

city=Boston;name=Bob;age=35 
city=New York;name=Michael;age=29 

我可以用別的東西用C,會給我不要整個行,直到「\ n」,但單獨對如:「城市=波士頓」,然後「名稱=鮑勃」等?

回答

1

查看strtok()功能。連續調用將從字符串中檢索每個令牌。

使用你的例子:

char record[BUFLEN]; 
if(fgets(record, BUFLEN, fp) != NULL) { 
    char *token; 

    token = strtok(record, ";"); 
    while (token != NULL) 
    { 
      doSomethingWith(token); 
      token = strtok(NULL, ";"); 
    } 
} 
+0

你仍然要閱讀完整的線,然後記號化它。它聽起來像OP不想首先閱讀完整的文本行。 – dice 2009-11-14 21:28:59

+0

我正在摔跤。既然你已經提供了滿足這個標準的答案,我們的OP有兩個不同的觀點要考慮,這取決於避免緩存整條線的重要性。 – 2009-11-14 21:32:08

2

,你可以在同一時間使用龜etc閱讀一個字節。

閱讀到= =成一個數組然後up up;在另一個

 do { 
      c = fgetc (pFile); 

      if (c == ';') 
      // etc 

     } while (c != EOF); 
+0

經過額外的考慮,我比你更喜歡你的答案。我將作爲替代品離開我的地方。 – 2009-11-14 21:35:12

0

您可能會重複fgets()的功能,只有它指定的分隔符「fget」,而不是\ n。代碼看起來像(這是PSEUDOCODE):

在此功能中,「DELIM」是您要使用的分隔符。而不是\n,它可能是;

char *GOEfgets(char *buf, int BUFLEN, FILE *fp, char DELIM) 
{ 
    int i = 0; /* counter */ 
    int character; 

    while(character = fgetc(fp)) /* we get a char from the stream one at a time */ 
    { 
     buf[i] = (char)character; /* store that character in the stream */ 

     if ((char)character == DELIM) /* if we run into our delimiter, we stop */ 
     { 
     return buf; 
     } 
    } 

} 
3

這看起來像scanf()可以使用的那些比較罕見的場合之一。

你可以嘗試:

while (fscanf(fp, "%[^=]=%[^;]", name, value) == 2) 
{ 
    if ((c = fgetc(fp)) == EOF) 
     break; 
    else if (c == ';') 
     ...continue with same line... 
    else if (c == '\n') 
     ...wrap up current line... 
    else 
     ...congratulations - format error of some sort... 
} 

或者,繼續使用 '與fgets()',但類似這樣的循環中使用 '的sscanf()'。

工作演示代碼:

#include <stdio.h> 
int main(void) 
{ 
    char name[20]; 
    char value[20]; 

    while (fscanf(stdin, "%19[^=]=%19[^;]", name, value) == 2) 
    { 
     int c; 
     if ((c = fgetc(stdin)) == EOF) 
      break; 
     else if (c == ';') 
      printf("name = %s; value = %s\n", name, value); 
     else if (c == '\n') 
      printf("name = %s; value = %s\n", name, value); 
     else 
      fprintf(stderr, "Ooops!\n"); 
    } 
    return(0); 
} 
+0

+ 1不錯的代碼,'scanf'也是IMO的正確工具。爲什麼有人會爲這種簡單的情況實施手動解析:) – AraK 2009-11-14 22:38:45

+0

+1你已經向我展示了我的C多麼生疏。 – dice 2009-11-15 10:13:50

相關問題