Vister26 Temat założony przez niniejszego użytkownika |
[C++] fstream - niepoprawne wczytywanie danych z pliku » 2015-08-14 22:17:10 Mój program ma za zadanie odczytać dane z pliku tekstowego i wyświetlić je na ekranie Oto część kodu(kompiluje się): #include <iostream> #include <fstream> #include <conio.h> #include <string.h> #include <stdlib.h>
using namespace std;
int main( int argc, char * argv[] ) { fstream odczyt; odczyt.open( argv[ 1 ], ios::in | ios::binary ); if( !odczyt.good() ) { cout << "Brak dostepu do pliku " << argv[ 1 ] << endl; getch(); return 1; } odczyt.seekg( 0, ios::end ); long length = odczyt.tellg(); odczyt.seekg( 0, ios::beg ); char * dane = new char[ length + 1 ]; odczyt.read( dane, length ); cout << dane; odczyt.close(); delete[] dane; getch(); }
Mam plik tekstowy z taką zawartością: °¨˙űŘř
Natomiast na wyjściu programu dostaję: ´╗┐┬░┬Ę╦Ö┼▒┼ś┼Ö
|
|
pekfos |
» 2015-08-14 22:33:43 Jaki masz cel w takim wyświetlaniu? Wyświetlaj w pętli, liczbowo wypisując każdy bajt. Obecnie wypisuje za dużo, bo nie zakończyłeś danych bajtem zerowym. |
|
Vister26 Temat założony przez niniejszego użytkownika |
» 2015-08-14 22:47:15 Tak też próbowałem i były błędy. Zastanawiam się, czy problemem może być kodowanie? Bo program działa poprawnie jeśli w pliku są "normalne" znaki ASCII o kodach w przedziale 0 - 127. Niestety w moim pliku są dane binarne wykraczające poza ten zakres. I program np. zamiast liczby 200 odczytuje jakieś ujemne liczby i w ogóle taki jedne "krzaczek" w pliku tekstowym zajmuje kilka bajtów. O co tu chodzi? |
|
pekfos |
» 2015-08-14 23:35:28 zamiast liczby 200 odczytuje jakieś ujemne liczby | char nie może mieć wartości 200. i w ogóle taki jedne "krzaczek" w pliku tekstowym zajmuje kilka bajtów. O co tu chodzi? |
Obecnie wypisuje za dużo, bo nie zakończyłeś danych bajtem zerowym. |
Pomijając już, że w ogóle nie powinieneś ich tak wypisywać. |
|
Vister26 Temat założony przez niniejszego użytkownika |
» 2015-08-15 16:29:39 Wcześniej zapomniałem dodać, że plik tekstowy jest generowany przez inny program, który wcześniej po prostu zapisywał do niego pakiety danych w postaci kilkubajtowych liczb, z kolei program odczytujący usiłował odczytać te dane jako znaki(jeden bajt). Teraz natomiast dane są zapisywane i odczytywane binarnie, po jednym bajcie - to rozwiązuje wszelkie problemy. Dzisiaj wieczorem podrzucę skrócony kod działających programów. |
|
pekfos |
» 2015-08-15 16:58:13 Wcześniej zapomniałem dodać, że plik tekstowy jest generowany przez inny program |
Treść pliku nie ma znaczenia. Błędny jest twój program i dostałeś odpowiedź, dlaczego. |
|
Vister26 Temat założony przez niniejszego użytkownika |
» 2015-08-16 12:34:56 Mam coś takiego: #include <iostream> #include <fstream>
using namespace std;
int main() { char nazwaPliku[] = "plik.txt"; fstream odczyt; odczyt.open( nazwaPliku, ios::in | ios::binary ); odczyt.seekg( 0, ios::end ); long length = odczyt.tellg(); odczyt.seekg( 0, ios::beg ); char * dane = new char[ length + 1 ]; odczyt.read( dane, length ); for( int i = 0; i < length; i++ ) { cout << "0x" << hex <<( int )( unsigned char ) dane[ i ] << " <--> "; cout << dane[ i ] << endl; } odczyt.close(); delete[] dane; }
Program działa poprawnie. Przykładowe wyjście: 0xa4 <--> Ą 0x89 <--> ë 0x82 <--> é 0x86 <--> ć 0xae <--> « 0xb9 <--> ╣ 0xcf <--> ¤ 0xa2 <--> ó
|
|
« 1 » |