[c++] wczytywanie zawartości plików graficznych

0

jak w temacie, program jest pod linuksa. Chciałbym wczytać zawartość np. pliku .png i wyświetlić ją np. w postaci binarnej lub tekstowej. Próbowałem robić to za pomocą strumienia.

fstream plik;
plik.open("lala.png" , ios::in) // lub ios::in | ios::binary

ale krzaki sie pojawiały jakieś i coś sie psuło ( np. po wykonaniu programu zamiast )

wojtek@wojtek-desktop:~$
było

┬⎺┘├␊┐@┬⎺┘├␊┐-␍␊⎽┐├⎺⎻:·$ 
0

A gdzie tu wyświetlanie jest ?
Jesli strumieniem wczytujesz binarki to musisz użyć Funkcji 'read' ...

0

a "read" nie jest tylko do "cin" ?
Wyświetlałem za pomocą cout << . A jak to zrobić tekstowo ?

0

mam taka mikrowizje:

ifstream plik("lala.png", ifstream::binary);
unsigned char c;
cout << setbase(16);
while(!plik.get(c).eof())
   cout << (int)c;
0

No wizja dobra ale autor tematu próbuje chyba wyświetlić
plik formatu graficznego w sposób tekstowy .

np. pliku .png

Nieporozumienie ?

ale krzaki sie pojawiały jakieś i coś sie psuło

Wszystkie pliki można wyświetlić strumieniem jako ciąg liczb
ale czy o to chodzi ?
Za pomocą 'cout' grafiki nie wyswietlisz ...

0
dzejo napisał(a)

Wszystkie pliki można wyświetlić strumieniem jako ciąg liczb
ale czy o to chodzi ?

O własnie o to chodzi :-)

0

To fajnie że nareszcie wiadomo o co chodzi .
A to dla zmylenia przeciwnika? :

ale krzaki sie pojawiały jakieś i coś sie psuło ( np. po wykonaniu programu zamiast )

wojtek@wojtek-desktop:~$

było
┬⎺┘├␊┐@┬⎺┘├␊┐-␍␊⎽┐├⎺⎻:·$

0
dzejo napisał(a)

To fajnie że nareszcie wiadomo o co chodzi .
A to dla zmylenia przeciwnika? :

ale krzaki sie pojawiały jakieś i coś sie psuło ( np. po wykonaniu programu zamiast )

wojtek@wojtek-desktop:~$

było
┬⎺┘├␊┐@┬⎺┘├␊┐-␍␊⎽┐├⎺⎻:·$

Nie rozumiem tego pytania ..

Wczytywałem binarnie , czyli jako ciag liczb

0

i ekhem... wskutek binarnego wczytywania z pliku wykrzaczał się prompt w powłoce? :> nie uważasz, że to inne instrukcje sprawiały, że prompt się sypał? możesz (tak z ciekawości proszę) pokazać cały program, który rozwalał prompt? jak długi, to wsadź do http://pastebin.4programmers.net/

0

jeżeli wypisał tę zawartość binarnie na konsolę, to prompt mógł się zmienić.

Polecam polecenie reset.

0

@Immilewski:
ja się na konsolach w linuksie nie znam, więc tak prosto zapytam:
czyli co, jak wywalę jakąś sekwencję na cout w stylu:
\55\21\23\43\66\23\77
to mogę modyfikować prompt?
mogę to robić w sposób kontrolowany?
wiem, że są kody sterujące zaczynające się od \33, ale tym można zmieniać nawet takie rzeczy? co można w takim razie robić, bo ja do tej pory żyłem w świadomości, że escape sequency to najwyżej jakieś kolorki, kursor i takie tam pierdołki mogą zmieniać ;)

0

dokladnie.. wezcie z'cat'ujcie sobie pierwsza lepsza binarke majaca ~50kB i macie 80+% szans ze sie termina wywali, bo w tej binarce trafia sie kody sterujace konsoli -- zmienia sie charset i juz sa krzaki. nawet kiedys pamietalem co trzeba wpisac zeby to cofnac.. ale to jest dosc upierdliwe i latwiej zrestartowac konsole..

0

escape sequence to wlasnie kolorki, kursory, kodowanie znakow itp. prompta ogolnie nie zmienisz -- problem tutaj z kodowaniem znakow/czcionka/charsetem jest.

0

Pomyłka, te krzaki pojawiały sie podczas próby odczytu pliku w formacie .jpeg
Przy próbie otwarcia .png, pojawiało sie coś takiego:

�PNG

Otwierałem to tak:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
     fstream plik("lala.png", ios::in | ios::binary);
     string showek;
     getline(plik , showek);
     cout<<showek<<"\n\n\n\n";
     
     plik.close();
    

}

Proszę nie bluzgać, uczę się dopiero... ;-)

0

No to juz quetzacoatl podal Ci rozwiazanie...

0

tak, tylko to quetzacoatl'a nie działa

0

A rozwin, prosze, megaskrot myslowy 'nie dziala', jesli chcesz otrzymac jakas pomoc w zwiazku z tym ;)

0

Pisze program w c++ ( nie wiem czy jego kod jest w c++ )

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
     ifstream plik("lala.png", ifstream::binary);
     unsigned char c;
     cout << setbase(16);
     while(!plik.get(c).eof())
     cout << (int)c; 
}

A to wypluwa bash;

wojtek@wojtek-desktop:~/Desktop$ g++ main.cpp -o program
main.cpp: In function ‘int main()’:
main.cpp:8: error: ‘setbase’ was not declared in this scope
main.cpp:9: error: no matching function for call to ‘std::basic_ifstream<char, std::char_traits<char> >::get(unsigned char&)’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/istream:272: note: candidates are: typename std::basic_istream<_CharT, _Traits>::int_type std::basic_istream<_CharT, _Traits>::get() [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/istream:286: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::get(_CharT&) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/istream:313: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::get(_CharT*, std::streamsize, _CharT) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/istream:324: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::get(_CharT*, std::streamsize) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/istream:347: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::get(std::basic_streambuf<_CharT, _Traits>&, _CharT) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/istream:357: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::get(std::basic_streambuf<_CharT, _Traits>&) [with _CharT = char, _Traits = std::char_traits<char>]
wojtek@wojtek-desktop:~/Desktop$ 
0
#include<iomanip>
0
main.cpp: In function ‘int main()’:
main.cpp:10: error: no matching function for call to ‘std::basic_ifstream<char, std::char_traits<char> >::get(unsigned char&)’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/istream:272: note: candidates are: typename std::basic_istream<_CharT, _Traits>::int_type std::basic_istream<_CharT, _Traits>::get() [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/istream:286: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::get(_CharT&) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/istream:313: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::get(_CharT*, std::streamsize, _CharT) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/istream:324: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::get(_CharT*, std::streamsize) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/istream:347: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::get(std::basic_streambuf<_CharT, _Traits>&, _CharT) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/istream:357: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::get(std::basic_streambuf<_CharT, _Traits>&) [with _CharT = char, _Traits = std::char_traits<char>]

:-/

0

zmien na char c, bez unsigned.

0

nic to nie dało

/tmp/ccvU0s9U.o: In function `__static_initialization_and_destruction_0(int, int)':
main.cpp:(.text+0x23): undefined reference to `std::ios_base::Init::Init()'
/tmp/ccvU0s9U.o: In function `__tcf_0':
main.cpp:(.text+0x6c): undefined reference to `std::ios_base::Init::~Init()'
/tmp/ccvU0s9U.o: In function `main':
main.cpp:(.text+0xac): undefined reference to `std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(char const*, std::_Ios_Openmode)'
main.cpp:(.text+0xd6): undefined reference to `std::cout'
main.cpp:(.text+0xdb): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::_Setbase)'
main.cpp:(.text+0xf2): undefined reference to `std::cout'
main.cpp:(.text+0xf7): undefined reference to `std::basic_ostream<char, std::char_traits<char> >::operator<<(int)'
main.cpp:(.text+0x10f): undefined reference to `std::basic_istream<char, std::char_traits<char> >::get(char&)'
main.cpp:(.text+0x123): undefined reference to `std::basic_ios<char, std::char_traits<char> >::eof() const'
main.cpp:(.text+0x138): undefined reference to `std::basic_ifstream<char, std::char_traits<char> >::~basic_ifstream()'
main.cpp:(.text+0x15f): undefined reference to `std::basic_ifstream<char, std::char_traits<char> >::~basic_ifstream()'
/tmp/ccvU0s9U.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status
0

U mnie tak hula.

#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
int main()
{
     ifstream plik("lala.png", ifstream::binary);
     char c;
     cout << setbase(16);
     while(!plik.get(c).eof())
     cout << (int)c;
}

a z bledu wynika, ze nie poprawiles tego ostatniego.

0

Mój kod wygląda identycznie

0

z bledu "main.cpp:(.text+0xd6): undefined reference to `std::cout'" wynika ze sie skompilowalo, ale nie linkuje sie poprawnie z biblioteka std C++

na pewno kompilujesz to jako C++ a nie jako C?

0

no ale kompilacja ci przechodzi, teraz masz kupę błędów linkera, a więc... jak to u ciebie jest z tym C++, że biblioteki standardowej nie dołącza? Jak to kompilujesz? Nie używasz gcc przypadkiem? :>

0

hm. wydaje mi sie ze gcc moze uzywac byle plik sie .cpp nazywal a nie .c .. zreszta, zalezy od ustawien..

0

No mi też sie tak wydawało, ale po kompilacji g++ już działa, dzięki za pomoc :-)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.