2015-05-04 293 views
0

我有一個編程任務,給出一個數據文件「candidatesdata.txt」 您應該讀取信息並解密名稱,性別,身高和體重。唯一的問題是每個數據記錄之間的名稱和逗號都有引號。文件如下:從文件中讀取時忽略不必要的字符C

Name,Gender,Height,Weight 
"Tanner, Mark C.」,M,71.8,180.25 
"Jinglehiemmerschmitt, John J.」,M,70.75,185.3 
"Parker, Sarah J.",F,65.25,120.3 

..cont。

如何讀取數據記錄並忽略引號和逗號? 這是我到目前爲止,它刪除了一些逗號和引號,但也在這個過程中它刪除了名稱。

#include <stdio.h> 

struct candidateinfo 
{ 
    char name[50]; 
    char gender; 
    double height; 
    double weight; 
}candidate; 


    int main() 
{ 
    int count =0; 
    FILE *candidate_data; 


    // Open file 
    candidate_data = fopen("/Users/moisestrevino/Documents/CS 1324/Assignment #5/Assignment #5/candidatedata.txt","r"); 

    fscanf(candidate_data, "%*[^\n]"); 
    fgetc(candidate_data); 

    // Get rid of unecessary letters 

     while (count<40) 
     { 
      count++; 

     fscanf(candidate_data,"\"%[^\"],%c,%lf,%lf\n", candidate.name, &candidate.gender, &candidate.height, &candidate.weight); 

      printf("%s %c %lf %lf\n",candidate.name, candidate.gender, candidate.height, candidate.weight); 
     } 

    fclose(candidate_data); 
    return 0; 

} 

輸出:

 Tanner, Mark C. 0.000000 0.000000 
,M,71.8,180.25 
    0.000000 0.000000 
Jinglehiemmerschmitt, John J. 0.000000 0.000000 
,M,70.75,185.3 
    0.000000 0.000000 
Parker, Sarah J. 0.000000 0.000000 
,F,65.25,120.3 
    0.000000 0.000000 
Meeks, Kalvin R. 0.000000 0.000000 
,M,57.25,210.2 


cont... 
+0

你___必須首先閱讀[this](http://stackoverflow.com/q/5431941/2173917)。 –

+0

也請縮進您的代碼 – Eregrith

+0

我應該使用EOF嗎? –

回答

0

你的代碼中包含大量的問題。有太多的提及,所以這裏是修復:

如果該文件包含表單數據:

Name,Gender,Height,Weight 

然後,

"Tanner, Mark C.",M,71.8,180.25 
"Jinglehiemmerschmitt, John J.",M,70.75,185.3 
"Parker, Sarah J.",F,65.25,120.3 

然後下面的修補程序將制定。

fopen後,您可以使用

fscanf(candidate_data, "%*[^\n]"); 
fgetc(candidate_data); 

第一線掃描,並放棄一切,直到一個換行符。第二行消耗換行符。在此之後,使用

fscanf(candidate_data, " \"%[^\"]\",%c,%lf,%lf", name, gender, height, weight); 

假設您已經聲明瞭一個char陣列名爲name相當規模的,名稱genderchar和名稱heightweight兩個double S,這裏是上述fscanf破裂:

  • (空格)掃描並放棄所有空白字符,直到第一個非空白字符。
  • \"從文件中掃描"並丟棄它。
  • %[^\"]掃描一切,直到"並將其存儲在name中。
  • \"從文件中掃描"並丟棄它。
  • ,掃描並丟棄一個逗號。
  • %c掃描一個字符並將其存儲在gender中。
  • ,掃描並丟棄一個逗號。
  • %lf掃描double並將其存儲在height中。
  • ,掃描並丟棄一個逗號。
  • %lf掃描double並將其存儲在weight中。

現在您可以打印每個值。將上面的fscanf放在一個循環中來讀取更多數據。

但是,您如何知道數據何時結束?檢查返回值fscanffscanf返回成功匹配和分配的輸入項的數量,該數量可能少於規定的數量,甚至在發生早期匹配失敗時甚至爲零。

在你的情況下,如果所有數據都被成功掃描,fscanf將返回4。所以,只要讀數據,直到fscanf不返回4.


正如@chux建議,可以防止緩衝區溢出利用

fscanf(candidate_data, " \"%49[^\"]\",%c,%lf,%lf", name, gender, height, weight); 

49告訴scanf掃描最多49個字符name( +1爲NUL終結符)

+0

'「\」%[^ \「]」,%c,%lf,%lf「' - >'」\「%[^ \」] \「,%c,%lf,%lf」'(添加斜槓)進一步的建議'「\」%49 [^ \「] \」,%c,%lf,%lf「'(加空格,寬度) – chux

+0

@chux,謝謝。 –

+0

建議在輸入文件中添加@ Random832註釋使用各種引用使''Tanner,Mark C.「''''vs'」'。 – chux

0

如果每行包含所有字段,則可以使用str(r)chr + atof來替代,例如

char line[100]; 
while(fgets(line,100,candidate_data)) 
{ 
    char *p = strrchr(line,','); 
    weight = atof(p+1); *p=0; 
    p = strrchr(line,','); 
    height = atof(p+1); 
    gender = *--p; 
    *strrchr(line,'"')=0; 
    strcpy(name, strchr(line,'"')+1); 
} 
相關問題