2013-01-11 228 views
2

我剛剛開始學習C++,並且正在開發一個程序,該程序應該從硬盤中獲取圖像,然後將其另存爲另一個名稱。原始圖像仍應保留。我已經得到它與文本文件,因爲我可以這樣做:讀取和寫入圖像數據C++

ifstream fin("C:\\test.txt"); 
ofstream fout("C:\\new.txt"); 

char ch; 
while(!fin.eof()) 
{ 
    fin.get(ch); 
    fout.put(ch); 
} 

fin.close(); 
fout.close(); 
} 

但我想這不是像這樣的圖像。我必須安裝一個庫或類似的東西才能使它工作?或者我可以「只」使用包含的庫?我知道我並不是真正的C++專家,所以請告訴我我是否完全錯誤。

我希望有人能夠並想幫助我!提前致謝!

順便說一句,圖像是一個.png格式。

+0

http://stackoverflow.com/q/4237405/1952879 – hmatar

+0

[(!fin.eof())''時是錯誤] (http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong)\ *打哈欠\ * –

+0

'但我想這不是像這樣的圖像.'爲什麼?所有文件都只是字節。 –

回答

6

您可以使用標準流,但在打開流時使用ios :: binary參數。這是有據可查的,並有幾個互聯網上的例子

+0

謝謝你,夥計! – GuiceU

2

你顯然是使用MS Windows:Windows通過不同的處理行分隔符區分「文本」和「二進制」文件。對於二進制文件,您不希望它在讀取時將\n\r轉換爲\n。爲了防止它,打開文件時使用ios :: binary模式,如@Emil tells you

順便說一句,你不必在windows下的路徑中使用\\。只需使用正斜槓:

ifstream fin("C:/test.txt"); 

甚至在第二次世界大戰中使用MS-DOS的情況下,這種工作方式還是有效的。

+0

+1第二次世界大戰參考 –

+0

Yeaah!感謝關於只有/而不是\\的提示,它正在工作! :) – GuiceU

0

如果目標只是複製一個文件,那麼CopyFile可能是比手動更好的選擇。

#include <Windows.h> 
// ... 
BOOL const copySuccess = CopyFile("source.png", "dest.png", failIfExists); 
// TODO: handle errors. 

如果使用Windows API是不是一種選擇,那麼在像你已經做了一次複製一個文件一個char是這樣做的非常低效的方式。正如其他人所指出的那樣,您需要以二進制文件的形式打開文件,以避免I/O與行尾的混淆。比一次一個字符更簡單,更有效的方法是這樣的:

#include <fstream> 
// ... 
std::ifstream fin("source.png", std::ios::binary); 
std::ofstream fout("dest.png", std::ios::binary); 
// TODO: handle errors. 
fout << fin.rdbuf();