2015-10-21 158 views
0

我無法從二進制文件複製並寫入文本文件。我寫了一個能夠從文本文件複製並寫入二進制文件的程序,但我無法做到相反。如何從二進制文件讀取C文本文件?

這裏是我有問題,我的功能:

void CopyBin2Text(char* rafname, char* txtname) 
{ 

FILE * fraf = fopen(rafname,"rb"); 
FILE * ftxt = fopen(txtname,"r+"); 

//READ FROM BINARY FILE 
struct PERSON p; 
int ByteOfBin; 


printf("ID \t NAME \t\t BALANCE \n"); 
printf("---------------------------------------\n"); 

當我運行我的程序停止在這裏打印上述聲明

while(!feof(fraf)) 
    { 
     fscanf(fraf, "%d %s %f", &p.ID, p.name, &p.balance); 

    ByteOfBin = ((p.ID/10-1)*sizeof(p)); 
    fseek(ftxt,ByteOfBin, SEEK_SET); 
    fwrite((char *)&p, sizeof(p), 1, ftxt); 

    } 


fclose(fraf); 
fclose(ftxt); 
} 

另一個問題之後我注意到,文本文件變得很大以至於打開。結果是我必須刪除文本文件並重新創建它。 任何人都可以解釋是什麼導致這種情況發生?

+0

你說你讀的是二進制文件,但你嘗試從它像一個文本文件中讀取? *和*你寫入文本文件就像一個二進制文件? –

+2

像fscanf()這樣的函數並沒有設計用於處理二進制文件。他們期望文本,應該在由語言支持的特定標準中提供。 – Havenard

+1

看看[**爲什麼是「while(!feof(file))」總是錯的?**](http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always -wrong?s = 1 | 2.6488)你需要檢查'fscanf'的返回值(你可能應該從二進制文件中讀取char-by-char'或者使用'fread'而不是'fscanf' - 是格式化文本...) –

回答

2

我對你的功能做了許多改變。文件打開模式,檢查它們是否打開,轉儲feof(),使用適當的二進制和文本函數進行讀取和寫入,並返回狀態以確定函數是否正常運行。

#include <stdio.h> 
#include <string.h> 

struct PERSON { 
    int ID; 
    char name[20]; 
    float balance; 
}; 

int CopyBin2Text(char* rafname, char* txtname)  // changed return value 
{ 
    FILE *fraf, *ftxt; 
    struct PERSON p; 
    if ((fraf = fopen(rafname,"rb")) == NULL) 
     return 0;         // failure 

    if ((ftxt = fopen(txtname,"wt")) == NULL) {  // changed mode 
     fclose(fraf); 
     return 0;         // failure 
    } 
    fprintf(ftxt, "ID\tNAME\tBALANCE\n"); 
    fprintf(ftxt, "---------------------------------------\n"); 
    while(fread(&p, sizeof(p), 1, fraf) == 1)  // use return value to loop 
     fprintf(ftxt, "%d\t%s\t%.2f\n", p.ID, p.name, p.balance); 
    fclose(ftxt); 

    fclose(fraf); 
    return 1;          // success 
} 

int makefile(char* rafname) 
{ 
    FILE *fraf, *ftxt; 
    struct PERSON p = {1,"alpha", 123.45}; 
    struct PERSON q = {2,"beta", 100.00}; 
    struct PERSON r = {3,"gamma", 9.99}; 
    if ((fraf = fopen(rafname,"wb")) == NULL) 
     return 0;         // failure 
    fwrite(&p, sizeof(p), 1, fraf); 
    fwrite(&q, sizeof(q), 1, fraf); 
    fwrite(&r, sizeof(r), 1, fraf); 
    fclose(fraf); 
    return 1;          // success 
} 

int main(void) 
{ 
    if (makefile("file.bin") == 0) 
     printf("Failure\n"); 
    else { 
     if (CopyBin2Text("file.bin", "file.txt") == 0) 
      printf("Failure\n"); 
     else 
      printf("Success\n"); 
    } 
    return 0; 
} 

輸出文本文件是

ID NAME BALANCE 
--------------------------------------- 
1 alpha 123.45 
2 beta 100.00 
3 gamma 9.99