2013-05-10 108 views
3

我在C中創建一個歸檔程序,我希望它保存我提供的文件,列出並提取它們。
我有很多問題,因爲我用一個文本文件進行保存,如果我想處理二進制文件,如音樂或照片,這不是最好的選擇,因爲當我提取它們時,它們不能正確執行(它們已損壞) 。 爲了解決這個問題,我想創建一個二進制檔案文件。我可以在二進制文件中使用fgetc()或fputc()嗎?

代碼文件寫入(上提取)如下:

void scriviFile(const char * arrivo)        //scrive i file creati in precedenza 
{ 
    FILE * partenza; 
    FILE * target; 
    int c; 
    int spazio = 'a'; 
    int i = 0; 
    int pos; 
    char * path; 
    path = collegaSlash(getcwd(NULL, 0), nome); 
    partenza = fopen(path, "rb"); 
    fseek(partenza, inizio, SEEK_SET); 
    target = fopen(arrivo, "wb");           //apro il file 
    if (target) {                //se è aperto 
     while ((c = fgetc(partenza)) != EOF && ftell(partenza)<=fine-10) {         //e il carattere preso non eccede la fine del file 
      fputc(c, target); 
      fputc(c, stdout); 
      pos = ftell(partenza); 
      if(pos==fine) 
      { 
       break; 
      } 
                      //scrivo lo stesso carattere in out (file in uscita) 
     }                 // 

     fclose(target);              //chiudo il file 
     fclose(partenza); 
    } 
    else 
    { 
     printf("errore di scrittura del file \n"); 
    } 

} 

因爲我需要二進制文件,以正確地提取,我可以使用的代碼,我寫了上面,還是我必須改變所有fgetc()fputc()功能與fread()fwrite()

感謝

+1

是的,你應該改變,或者你可能花費大量的時間用調試器發現你的fget得到了一些無效值並且造成了破壞 – abasu 2013-05-10 09:27:23

+0

當讀寫一個字母來打開一個二進制文件時沒有問題。 – BLUEPIXY 2013-05-10 09:35:24

+1

@abasu你在說什麼?我在這裏看到使用'fgetc'沒有問題。停止誤診。我確實看到了幾個未聲明的變量的用法。出於這個原因,我們不能幫助AndreaGottardi與此代碼。 AndreaGottardi:創建一個最小的可編譯測試用例,將結構中的信息(不一定是'struct')寫入文件。然後創建一個最小的,可編譯的測試用例,將文件中的信息讀取到結構中。在這裏提供他們兩個,但只有在他們實際編譯時...提出一個關於你不明白的東西的問題...... – Sebivor 2013-05-10 09:38:24

回答

8

您使用fgetc()fputc(),你可以從該名男子頁面描述看到這些功能:

龜etc()從流中讀取下一個字符,並將它作爲一個無符號char轉換爲int,或EOF結束文件或錯誤。

fputc()將字符c寫入到一個無符號字符中進行流式處理。

字符,在C,是由標準定義永遠是正好爲1字節(8位),這意味着當你在一個文件中使用fxxxc()你會得到1個字節(即恰好是一個字符在文本文件中)。

如果你提取並重建一個二進制文件,逐字節,你會得到一個確切的副本。所以不,在二進制文件類型上使用fgetc()fputc()沒有問題。你總是可以用一個簡單的示例程序證實這一點...例如:

int main() 
{ 
    FILE * fptr = fopen("small_pic.jpg", "rb"); // open existing binary picture 
    char buffer[10000] = {0}; // the pic is 6kb or so, so 10k bytes will hold it 
    FILE * fptr2 = fopen("new_small_pic.jpg", "wb"); // open a new binary file 
                 // for our copy of the pic 
    unsigned long fileLen; 
    unsigned long counter; 

    fseek(fptr, 0, SEEK_END); 
    fileLen=ftell(fptr);  // get the exact size of the pic 
    fseek(fptr, 0, SEEK_SET); 

    for(counter=0; counter<fileLen; counter++) 
     fputc(fgetc(fptr),fptr2); // read each byte of the small_pic.jpg and make 
              // a new pic from it 

    fclose(fptr); 
    fclose(fptr2); 
return 0; 
} 

最終結果是:我們有兩個完全相同的圖像,因爲fgetc()fputc()可以在二進制文件中使用。

0

我正在C中創建一個歸檔程序,我希望它保存文件我提供,列出並提取它們。我有很多問題,因爲我用 文本文件保存,並且它不是最好的選擇,如果我想 處理二進制文件,如音樂或照片,因爲當我提取 他們,他們不正確執行(他們已損壞)。爲了解決這個問題,我想用 來創建一個二進制檔案文件。

--SNIP--

因爲我需要二進制文件,以正確地提取,可我使用的代碼,我 上面寫的,還是我不得不改變所有的龜etc()和fputc()函數的功能 用fread ()和fwrite()?

在二元模式下工作時,您可以使用上面編寫的代碼。它與fgetcfputc,freadfwrite無關。此功能在文本模式下工作時效果不佳的原因是ftell不保證對除fseek以外的任何內容有用,因此在處理打開的文件時代碼ftell(partenza)<=fine-10不是特別合適文本模式。通過重構您的代碼,您可以刪除ftell並處理大於4GB的文件......但這不應該是重構此代碼的唯一原因。

相關問題