2014-02-25 33 views
4

我試圖製作一個exe程序,可以讀取任何文件到二進制文件,然後使用這個二進制文件製作完全相同的文件。fwrite似乎並沒有複製整個文件(只是開始)

所以我想通了,我可以用fopen(content,"rb")讀取文件作爲二進制, 使用fwrite我可以寫數據塊到流。但問題是當我fwrite它似乎並沒有複製一切。

例如,我打開的文本包含31231232131。當我將它寫入另一個文件時,它僅複製3123(前4個字節)。

我可以看到,這是一件非常簡單的事情,但我不知道是什麼。

#include <stdio.h> 
#include <iostream> 

using namespace std; 
typedef unsigned char BYTE; 
long getFileSize(FILE *file) 
{ 
    long lCurPos, lEndPos; 
    lCurPos = ftell(file); 
    fseek(file, 0, 2); 
    lEndPos = ftell(file); 
    fseek(file, lCurPos, 0); 
    return lEndPos; 
} 

int main() 
{ 
    //const char *filePath = "C:\\Documents and Settings\\Digital10\\MyDocuments\\Downloads\\123123.txt"; 
    const char *filePath = "C:\\Program Files\\NPKI\\yessign\\User\\008104920100809181000405,OU=HNB,OU=personal4IB,O=yessign,C=kr\\SignCert.der"; 


    BYTE *fileBuf;   
    FILE *file = NULL;  
    if ((file = fopen(filePath, "rb")) == NULL) 
     cout << "Could not open specified file" << endl; 
    else 
     cout << "File opened successfully" << endl; 
     long fileSize = getFileSize(file); 
     fileBuf = new BYTE[fileSize]; 
     fread(fileBuf, fileSize, 1, file); 
     FILE* fi = fopen("C:\\Documents and Settings\\Digital10\\My Documents\\Downloads\\gcc.txt","wb"); 
    fwrite(fileBuf,sizeof(fileBuf),1,fi); 


    cin.get(); 
    delete[]fileBuf; 
    fclose(file); 
    fclose(fi); 
    return 0; 
} 
+2

在'{'和'}'中包含else子句。縮進並不確定'C++'中的塊。否則,如果您無法打開文件,代碼將會崩潰。 –

+1

你不用C語言編程,你正在使用C++。您使用'<<'運算符執行輸出的方式是100%C++。我已經重新標記了這個問題。 – unwind

+0

@unwind儘管很少couts這肯定是C的問題。 – user3125367

回答

3
fwrite(fileBuf,fileSize,1,fi); 

你讀過fileSize字節,但寫sizeof(...)字節,也就是指針的大小,用new返回。

+0

fileSize是我無法複製所有內容的問題。謝謝。 – user3300378

0

您已交換freadfwrite的參數。元素大小在元素數量之前。應該是像這樣:

fread(fileBuf, 1, fileSize, file); 

而且

fwrite(fileBuf, 1, fileSize, fi); 

而且從上面的地址我的評論:

括起來else子句中{}。縮進不會確定C++中的塊。否則,如果您無法打開文件,代碼將會崩潰。

編輯:和另一個問題 - 你一直在寫sizeof(fileBuf)字節是不變的。相反,你應該寫出與你讀過的字節完全相同的字節數。考慮到您的其他代碼,您可以簡單地將sizeof(fileBuf)替換爲fileSize,如上所述。

+0

這是一個非常可恥的錯誤。謝謝你的發現。 – user3300378

+0

這不是爲什麼只寫4個字節:) – user3125367

+0

是。但仍然是一個可恥的錯誤。 – user3300378

2

A C++的方式來做到這一點:

#include <fstream> 

int main() 
{ 
    std::ifstream in("Source.txt"); 
    std::ofstream out("Destination.txt"); 
    out << in.rdbuf(); 
} 
0
 
     fileBuf = new BYTE[fileSize]; 
     fread(fileBuf, fileSize, 1, file); 
     FILE* fi = fopen("C:\\Documents and Settings\\[...]\gcc.txt","wb"); 
    fwrite(fileBuf,sizeof(fileBuf),1,fi); 

fileBuf是指向​​。你自己宣佈它,看看:BYTE *fileBuf。所以sizeof(filebuf)sizeof(BYTE *)

也許你想:

fwrite(fileBuf, fileSize, 1, fi); 

其密切反映早期fread電話。

我強烈建議您捕獲I/O函數的返回值並檢查它們。