2013-01-11 2 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(); 
} 

Но я полагаю, что это не так, как это с изображениями. Должен ли я установить lib или что-то подобное, чтобы заставить его работать? Или я могу «просто» использовать включенные библиотеки? Я знаю, что я на самом деле не специалист по C++, поэтому, пожалуйста, скажите мне, если я полностью ошибаюсь.

Я надеюсь, что кто-то может и хочет мне помочь! Заранее спасибо!

Btw, изображение является .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) \ * yawn \ * –

+0

'Но я полагаю, что это не так с изображениями.' Почему это? Все файлы - это просто байты. –

ответ

6

Вы можете использовать std-потоки, но при открытии потока используйте двоичный аргумент ios ::. Это хорошо документировано, и есть несколько примеров в Интернете.

+0

Спасибо, чувак, он работает! – GuiceU

2

Вы, по-видимому, используете MS Windows: Windows различает «текстовые» и «двоичные» файлы путем различной обработки разделителей строк. Для двоичного файла вы не хотите, чтобы он переводил \n\r в \n при чтении. Чтобы предотвратить его, используйте ios :: двоичный режим при открытии файла, как @Emil tells you.

BTW, вам не нужно использовать \\ в дорожках под окнами. Просто используйте косые черты:

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

Это работало еще во Второй мировой войне с использованием MS-DOS.

+0

+1 для ссылки на WWII –

+0

Да! Спасибо за отзыв о том, что у меня/вместо \\ он работает! :) – GuiceU

0

Если целью является только копирование файла, то CopyFile, вероятно, лучший выбор, чем выполнение этого вручную.

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

При использовании Windows API не вариант, а затем скопировать файл один символ в то время, как вы сделали это очень неэффективный способ сделать это. Как отмечали другие, вам нужно открывать файлы как двоичные файлы, чтобы избежать ввода-вывода с окончанием строки. Более простой и более эффективный способ, чем одним символом в то время, заключается в следующем:

#include <fstream> 
// ... 
std::ifstream fin("source.png", std::ios::binary); 
std::ofstream fout("dest.png", std::ios::binary); 
// TODO: handle errors. 
fout << fin.rdbuf(); 
Смежные вопросы