2015-07-10 48 views
0

任何人都可以請幫我解決下面的代碼嗎?使用「fread」獲取意外輸出

#include<stdio.h> 
#include<stdlib.h> 
int main() 
{ 
    FILE *fp; 
    char another= 'Y'; 
    struct emp 
    { 
     char name[14]; 
     int age; 
     float bs; 
    }e; 
    fp = fopen("Employee.DAT", "wb"); 
     if (fp == NULL) 
    { 
     printf("Cannot open file"); 
     exit(1); 
    } 
    while (another == 'Y') 
    { 
     printf("\nEnter name, age and basic salary:"); 
     scanf("%s %d %f", e.name, &e.age, &e.bs); 
     fwrite(&e, sizeof(e), 1, fp); 
     printf("Add another record?(Y/N)"); 

     another=_getche(); 
    } 
    fclose(fp); 
    return 0; 
} 

我試着輸入以下內容:
Abc 19 11111 Def 20 22222 Ghi 21 33333
爲下面的代碼的輸出應該將上述代碼的輸入,但我得到了下面的輸出圖像中下面附:
enter image description here

#include<stdio.h> 
#include<stdlib.h> 
int main() 
{ 
    FILE *fp; 
    struct emp 
    { 
     char name[14]; 
     int age; 
     float bs; 
    }e; 
    fp = fopen("Employee.dat", "rb"); 
    if (fp == NULL) 
    { 
     printf("Cannot open file"); 
     exit(1); 
    } 
    while (fread(&e, sizeof(e), 1, fp) == 1); 
    printf("%s %d %f\n", e.name, e.age, e.bs); 
    fclose(fp); 
    return 0; 
} 

我認爲這個問題是用「的fread」,但我無法找出問題。

+2

您是否檢查過fread的返回值實際上是1?您的打印語句不在while循環中,因此它將以任一方式執行。 –

+3

當'fread'讀取一個無效的條目時,'while'循環只會停止讀取,而且 - 意外! - 是將要打印的那個。刪除該行末尾的';'。 – usr2564301

+0

我認爲你必須在寫完後關閉文件。同時檢查你的while循環,因此刪除;之後... – TryinHard

回答

3
while (fread(&e, sizeof(e), 1, fp) == 1); 
printf("%s %d %f\n", e.name, e.age, e.bs); 
fclose(fp); 

你的print語句是while循環之外,所以它會只打印最後一次讀取的信息(或無效的,如果沒有的fread調用成功)。

縮進和蓋帽幫助編寫正確的代碼:

while (fread(&e, sizeof(e), 1, fp) == 1) { 
    printf("%s %d %f\n", e.name, e.age, e.bs); 
} 
fclose(fp); 

同時請注意,這不是序列化數據的好或可靠的方法。結構的佈局(甚至是部分,查找字節順序)可能會在不同的編譯器和體系結構之間發生變化。


此外,您應該在寫入其他代碼後關閉文件。

+0

謝謝你,我明白你的意思。 ;可以嚴重導致自殺產出。 –

1

請while語句後刪除分號:

while (fread(&e, sizeof(e), 1, fp) == 1) { 
    printf("%s %d %f\n", e.name, e.age, e.bs); 
} 
fclose(fp); 

有了分號,循環遍歷所有記錄,只要沒有更多的記錄存在停止。現在printf()打印來自文件的最近(最後)讀取記錄的詳細信息。

的代碼實際上表現爲:

while (fread(&e, sizeof(e), 1, fp) == 1) 
    ;  
printf("%s %d %f\n", e.name, e.age, e.bs); 
fclose(fp); 

另外,請關閉文件寫入記錄後不久。

+0

是的,我做了,但是我錯過了這段代碼中的表達,因爲它是複製粘貼。唯一的問題是;在while語句結束時。 –

1
while (fread(&e, sizeof(e), 1, fp) == 1); 
printf("%s %d %f\n", e.name, e.age, e.bs); 

printf聲明應該在while循環中。之後刪除;fread將讀取到直到最後一條記錄的end of file和循環將打印最後一條記錄後的printf

1
while (fread(&e, sizeof(e), 1, fp) == 1); 

從循環中刪除該分號,你就完成了!