2012-11-28 60 views
3

相同的文件我有一個文本文件,它看起來像這樣:讀int和焦炭從用C

i 3755 
i 3633 
i 4435 
i 1434 

我將如何去閱讀這作爲輸入,我已經使用的fscanf嘗試過,但它不斷給我後,隨機字符 '我'

例如輸出會是什麼樣子

我3755%

酷睿i5 3633

這是我一直想:

int data = 0; 
char command; 
if(fptr==NULL) 
    printf("File Cannot Be Read"); 

fscanf(fptr,"%c %d\n", &command, &data); 
printf("%c " , command); 
printf("%d\n" , data); 

fscanf(fptr,"%s %d\n", &command, &data); 
printf("%c " , command); 
printf("%d\n" , data); 

fscanf(fptr,"%s %d\n", &command, &data); 
printf("%s " , command); 
printf("%d\n" , data); 

他們都不工作。感謝您的幫助!

編輯:繼承人爲有同樣的問題,任何人的工作代碼:

int data = 0; 
char command; 
fptr = fopen(argv[1], "r"); 

if(fptr==NULL) 
    printf("File Cannot Be Read"); 

while(fscanf(fptr,"%c %d \n", &command, &data) == 2) 
{ 

     if(command == 'i') 
     { 
      printf("insert found\n"); 
     } 
      if(command == 'd') 
     { 
      printf("delete found\n"); 
     } 

} 

}

回答

4
fscanf(fptr,"%c %d", command, &data); 

應該是:

fscanf(fptr,"%c %d", &command, &data); 
getchar(); // consume the newline character that fscanf left. 

假設你定義:

char command; 
int data; 
+0

它可能是'fscanf(fptr,「%c%d \ n」,&com mand和&data)' –

+0

ah getchar()命令就是我當時所缺少的,但是如何才能推入我的程序才能獲得下一行? – Harrison

+0

ohhhh我知道了,通過從fscanf(fptr,「%s%d \ n」,&命令中刪除\ n,在沒有getchar()的情況下工作,&data); 將會放入一個當然循環中。你幫助大家 – Harrison

1

爲了簡單起見,我建議您在循環中使用fgets()來讀取一行,然後使用strtok()來獲取不同的「字符串」,然後根據您的解析方法進行強制轉換。但邁克也是對的,你可以使用fscanf(fptr, "%c %d\n", &command, &data)來閱讀。在使用字符串時,可以忽略變量名稱前的「&」的用法。但是,當它的字符或整數或浮點數..你將需要使用運營商的地址(「&」)

1

這是不正確的,會導致緩衝區溢出:

fscanf(fptr,"%s %d", &command, &data); 

command僅具有足夠的空間用於單個char,但fscanf()格式指定符"%s"將讀取直到下一個空白字符,然後將終止空字符寫入command。使用char[]來讀取並限制要讀取的char的數量。

請注意,NULL檢查只是打印錯誤消息,它實際上並不阻止使用NULL文件指針。


爲了確保每個線是正確格式的使用fgets()讀取線,然後使用sscanf()讀取的字段。如果fscanf()使用直接從那麼該文件讀取這些行:

 
i 
3755 

被相同地處理,以線:

 
i 3755 

作爲一個新行字符也是空白。 例子:

if (fptr) 
{ 
    char line[1024]; 
    while (fgets(line, 1024, fptr)) 
    { 
     char command; 
     int data; 
     if (2 == sscanf(line, "%c %d", &command, &data)) 
     { 
      /* Use 'command' and 'data'. */ 
     } 
    } 
} 
1

在這一行:

fscanf(fptr,"%c %d", command, &data); 

你應該給它一個指針命令。像這樣:

fscanf(fptr,"%c %d", &command, &data); 

下一行不能工作,因爲讀光標已經在文件的末尾。

0

在您的fscanf函數中,您必須期望通過在格式末尾添加空格來返回行。像這樣

fscanf(fptr,"%c %d ", &command, &data); 

空格字符替換返回新行,製表和空格

BTW我看到你使用%s讀取字符&command,這是不正確

fscanf(fptr,"%s %d\n", &command, &data); 

你有用這個代替

fscanf(fptr,"%c %d ", &command, &data);