2015-09-05 57 views
0

我需要讀取一個隨機排列的ASCII字符的文件,並根據我得到的任何字符做一些事情。我可以得到任何這些字符類型「/」,「*」,一個字符串或數字。我需要針對每種情況做一些不同的事情。我認爲最好的方法是從fgets開始逐行閱讀。之後,我通常會使用sscanf,但由於我將讀取的文件有隨機排列的ASCII字符,我不確定如何執行此操作。這是我開始的。任何想法將不勝感激。隨機閱讀文件

while(fgets(buffer, 80, fp) != NULL) 
{ 
    /*if(/) 
    { 
     //do something for "/" character 
    } 
    if(*) 
    { 
     //do something for "*" character 
    } 
    if(string) 
    { 
     //do something for string 
    } 
    if(numbers) 
    { 
     //do something for numbers 
    }*/ 
    memset(buffer, 0, 80); 
} 
+0

你可以嘗試switch語句或查表法 –

+0

你應該遍歷緩衝區的內容,並在每個迭代進行修改。我不太明白代碼末尾的memset的用途。 – 2015-09-05 06:41:15

+1

您可以通過顯示示例輸入文件來改善問題。 – user3386109

回答

0

例子是這樣的:

while(fgets(buffer, 80, fp) != NULL) 
{ 
    char ch, cx = 0; 
    double n; 

    if(sscanf(buffer, "%c %c", &ch, &cx) == 1){ 
     if(ch == '/'){ 
      puts("/"); 
     } else if(ch == '*'){ 
      puts("*"); 
     } 
    } else if(sscanf(buffer, "%lf %c", &n, &cx) == 1){ 
     puts("number"); 
    } else {//Check further limiting condition? 
     puts("string"); 
    } 
    memset(buffer, 0, 80); 
} 
0

您正確的思維。任何這些類型問題的關鍵是將行讀入緩衝區,就像你所做的那樣。然後你必須理解緩衝區中的內容。通常,大部分決策都可以在緩衝區的第一個字符上進行(例如+,-,/,*,...)。

還有其他一些情況,你將需要進一步處理行,你已經通過後您的初始測試(例如isdigit(),或isalpha()(這可以減少到簡單的字符比較,以避免函數調用)。

處理兩者的簡單方法是簡單地指定一個指向緩衝區的指針,然後使用指針對緩衝區進行處理,以便測試,提取或傳遞所需的元素到您的處理函數。

現在下一個挑戰是循環控制,有些測試我需要整個字符串,有些可能只關心第一個char。 ething像下面將讓你處理任何行以優雅的方式來獲得您所需要的信息:

while(fgets(buffer, 80, fp) != NULL) 
{ 
    char *p = buffer; 
    while (*p) 
    { 
     if(/) 
     { 
      //do something for "/" character 
     } 
     if(*) 
     { 
      //do something for "*" character 
     } 
     if(('A' <= *p && *p <= 'Z') || ('a' <= *p && *p <= 'z')) 
     { 
      // do something for string 
      // handle initial char 
      while (*p) { 
       // handle rest of string; 
       p++; 
      } 
      if (!*p) 
       goto nextline; 
     } 
     if('1' <= *p && '9' <= *p) 
     { 
      // do something for numbers 
      convert numbers with atoi() or strtol(), .... 
      if (endofline) 
       goto nextline; 
     } 
     p++; 
    } 
    nextline:; 
    //memset(buffer, 0, 80); /* not needed */ 
} 

有更加多樣化,不同的方式來做到這一點比你能擺一隻死貓。您可以選擇適合您的數據的程序控制方法。如果您有任何問題,請告訴我。

+0

我知道我對指針的理解不如我想象的那麼好。如果緩衝區以字符串開始,它將如何處理數字?它似乎沒有辦法處理數字後,它進入if語句的信件。那是對的嗎? – rocker

+0

希望我會記得strtok。我覺得我比這更需要努力。 – rocker

+0

這是值得黃金的重量,特別是如果你把它包在一個for循環,例如, 'char * p; for(p = strtok(str,delim); p; p = strtok(NULL,delim))'。 –