2011-01-11 239 views
0

我對strcpy()函數有個疑問。我想要做的是用戶輸入文件名,我基本打開文件,獲取內容並創建文件副本。c strcpy文件描述符

但是,我決定做一些錯誤檢查,以檢查在寫入之前,read()內容是否與複製文件中寫入的內容相同。所以,我使用文件讀取的文件大小將內容讀入()內容到動態數組中,所以緩衝區是適合數據的大小。然後我想創建一個到另一個動態緩衝區的副本,並使用strcmp()來查看它們是否相同,如果是這樣,那麼我將複製緩衝區寫入輸出文件?

也能正常工作的某些文件,但問題與視頻文件(MPEG)等,打開一個視頻文件出現錯誤「無法確定流的類型」,繼承人的想法時,

char* buffer1 = malloc(filessize); 
char* buffer2 = malloc(filessize); 
read(file, buffer1, filesize); 
strcpy(buffer2, buffer1); //copy buffer1 into buffer2 
if(strcmp(buffer1, buffer2) == 0) 
{ 
    write(outputfile, buffer2, filesize); //write copied buffer to file 
} 
free(buffer1); free(buffer2); 

那麼爲什麼我在內存中創建了另一個緩衝區副本,以便我可以比較實際的位數據,而不僅僅是大小,所以我知道正在寫入的數據與正在讀取的數據相同?

+0

你有沒有試過在二進制模式下打開視頻文件? – programmer 2011-01-11 13:20:00

+0

簡短的完整性檢查:爲什麼要將文件內容複製到內存中?這絕對沒有必要,因爲文件內容可以用讀緩衝區的內容直接寫入。 – 2011-01-11 13:25:24

回答

1

您應該使用memcpy來代替,因爲strcpy只會複製到第一個'\ 0'字符。這對二進制文件非常有效。真正的問題是你爲什麼要複製內存中的文件的內容,但你可以將原始緩衝區寫出到一個新文件中。

6

strcpystrcmp用於C字符串,它是0終止的。如果您的視頻文件具有值爲0的任何字節,則它們將在此處停止。

您應該看看memcpymemcmp,而不是將緩衝區解釋爲0終止的字符串。