Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] fstream - niepoprawne wczytywanie danych z pliku

Ostatnio zmodyfikowano 2015-08-16 12:34
Autor Wiadomość
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ę):
C/C++
#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;
    }
   
    //sprawdzanie rozmiaru pliku
    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ę:

´╗┐┬░┬Ę╦Ö┼▒┼ś┼Ö

P-136282
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.
P-136284
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?
P-136285
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ć.
P-136286
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.
P-136302
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.
P-136303
Vister26
Temat założony przez niniejszego użytkownika
» 2015-08-16 12:34:56
Mam coś takiego:
C/C++
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    char nazwaPliku[] = "plik.txt";
   
    fstream odczyt;
    odczyt.open( nazwaPliku, ios::in | ios::binary );
    // Brak obsługi błędów dla uproszczenia kodu
   
    // Sprawdzanie rozmiaru pliku
    odczyt.seekg( 0, ios::end );
    long length = odczyt.tellg();
    odczyt.seekg( 0, ios::beg );
   
    // Wczytanie zawartości pliku do dynamicznej tablicy
    char * dane = new char[ length + 1 ];
    odczyt.read( dane, length );
   
    // Wyświetlenie zawartości pliku
    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 <--> ó
P-136347
« 1 »
  Strona 1 z 1