2015-09-20 114 views
5
char id; 
int num, r; 
if (argc != 2) { 
    printf("error\n"); 
    exit(1); 
} 

FILE *file = fopen(argv[1], "r"); 
if (file == NULL) { 
    printf("error\n"); 
    exit(1); 
    } 

    while ((r = fscanf(file, "%c\t%d", &id, &num)) != EOF) { 
    if(r == 2) { 
     printf("id: %c, value: %d\n", id, num); 
    } 
    else if (r!=2) { 
     printf("bad input\n"); 
    } 
    } 

的文件,我想讀的樣子:的fscanf - 我不知道我在做什麼錯在這裏

我10

我12

d 10

d 12

(字符/整數以製表符分隔)。我的輸出是:

ID:ⅰ,值:10

壞輸入

ID:ⅰ,值:12

壞輸入

ID:d,值: 10

不良輸入

ID:d,值:12

壞輸入

我到底做錯了什麼?如果文件格式不正確,只能打印「不良輸入」。上面的文件演示了格式正確的文件。我不明白r == 2r != 2在同一時間(兩種條件都以某種方式滿足)。

+0

不要檢查scanf是否返回EOF。您應該檢查它是否返回預期項目的數量。 –

+0

'\ n'和空格也有意義。 – Matt

+0

如果您打開了「FILE」,則不應該「退出」:它不會完全關閉。 – edmz

回答

4

使用

while((r = fscanf(file, " %c\t%d", &id, &num)) != EOF) //Whitespace before %c 

可能會解決你的問題。因爲當你使用

fscanf(file, "%c\t%d", &id, &num) 

然後它留下一個換行字符,在下一次迭代中消耗。 當你的下一次迭代你的id得到\nnum得到的字符。

但是,如果在%c之前放置了額外的空白區域,它會告知fscanf()忽略空格(包括製表符,空格或換行符)。 因此,您的fscanf()獲取兩個參數(字符和數字)。

+3

看起來像是有效的!你能解釋爲什麼空白造成了差異嗎?非常感謝! – Sara

+0

很棒的回答。非常感謝你。 – Sara

2

請在的fscanf最終改變

while ((r = fscanf(file, "%c\t%d", &id, &num)) != EOF) { 

while ((r = fscanf(file, "%c\t%d\n", &id, &num)) != EOF) { 

添加\ n。

在您的文件中,行以\ n結尾。 在接下來的閱讀中,它並不順利。

相關問題