2015-04-05 71 views
0

我正在編寫一個封裝來幫助我在將來的項目中(我完成了C書),並且希望在不使用fgetc的情況下複製文件。這是我的代碼,它不起作用:爲什麼這種複製文件的方式不起作用

int CopyFile(char* filename, char* dest) 
{ 
    FILE* fp, *fout; 
    fp = fopen(filename,"rb"); 
    //fout = fopen(dest, "wb"); 
    if(fp == NULL) 
    { 
    return -1; 
    } 
    /*while((c = fgetc(fp)) != EOF) 
    { 
    fputc(c,fout); 
    }*/ 
    long size = GetFileSize(fp); 
    printf("%lu", size); 
    char* file = malloc(size); 
    fread(file, size, 1, fp); 
    //fclose(fp); 
    fout = fopen(dest, "wb"); 
    fwrite(file, size, 1, fout); 
    fclose(fp); 
    fclose(fout); 
    return 0; 

} 

我甚至用hexeditor打開文件,他們不相似。我究竟做錯了什麼?

+1

*文件有什麼不同?在尺寸方面?內容?你確定'GetFileSize'返回的大小是否正確?你是否檢查過['fread'](http://en.cppreference.com/w/c/io/fread)或['fwrite'](http://en.cppreference.com/w/c/ io/fwrite)調用失敗?或者不讀/寫你要求的所有內容? 'GetFileSize'做什麼? – 2015-04-05 15:24:52

+0

請參閱[GetFileSize](https://msdn.microsoft.com/en-us/library/windows/desktop/aa364955%28v=vs.85%29.aspx) – BLUEPIXY 2015-04-05 15:41:38

+0

@BLUEPIXY似乎並不一樣OP在所示程序中使用的功能。 – 2015-04-05 15:57:04

回答

3

問題在於GetFileSize函數,其中您將文件指針移至末尾,但您再也不會從rewind開始。

這意味着您的fread函數調用實際上不會讀取任何內容,因爲指針已經在文件末尾。所以寫的是分配內存的內容,它是不確定的(並且看起來是隨機的)。

如果您檢查fread返回的內容,您會立即看到此內容。

這是一個總是檢查可能以某種方式失敗的函數的返回值的教訓。

+0

你是最好的男人<3 當我編碼的功能,我在想這個文件rewinded與回報(這麼愚蠢)。 – krystalgamer 2015-04-05 17:49:29

相關問題