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

Problem z odczytaniem zawartości pliku <fstream>

Ostatnio zmodyfikowano 2013-11-24 18:47
Autor Wiadomość
pekfos
» 2013-11-24 18:16:08
Skoro to ma tak wyglądać to powiedz mi czemu to działa :P
Zapewne kompilator wygenerował kod zerujący tablicę (tryb debug?), przez co masz zero po wczytanych danych. Jeśli plik będzie miał ponad 1023 bajty, to już zobaczysz krzaki.

Czy to jest jakiś karygodny błąd przez, który aplikacja może się sypnąć czy coś w tym rodzaju ?
Tak.
P-97359
Zdziwiony
Temat założony przez niniejszego użytkownika
» 2013-11-24 18:19:19
Czyli ta jedna linijka robi tak wielką różnice :P

memset( bufor, '*', 1024 );

A mogę zadać pytanie co ta jedna linijka robi :) ?

PS: Jak odpowiesz to temat do zamknięcia, bo problem rozwiązany.

PS2: Ejjj... ta jedna linijka psuje program :P Ona dodaje w cholerę gwiazdek po wczytanym tekście :P
P-97360
Buby
» 2013-11-24 18:24:32
Chodzi o to, że tablica ma mieć miejsce na NULLA '/0'.
Na końcu każdej tablicy znaków czy też stringa znajduje się
null. Przykładowo wiele funkcji sprawdzających lub operujących na wyrazach
działa dopóki nie napotka nulla. Więc jeśli do tablicy char[1024] wczytasz 1024 znaki,
to zabraknie Ci miejsca na NULL. Wtedy mogą nastąpić trudne do wykrycia błędy lub pisanie po
pamięci. Co skutkuje napisem 'Nastąpił błąd, aplikacja zostanie zamknięta'.

@Edit, a funkcja
memset()
 wypełnia tyle miejsc tablicy ile masz w trzecim
argumencie takim znakiem, jaki jest w drugim argumencie. Pierwszym jest tablica znaków.

Wg. mnie pekfos chciał zapełnić tablicę, przed wprowadzeniem danych.


@Zdziwiony, a spróbuj zapisać w pliku tekstowym 2000 znaków i zobacz, czy program zadziała.
P-97361
pekfos
» 2013-11-24 18:28:45
A mogę zadać pytanie co ta jedna linijka robi :) ?
Wypełnia bufor gwiazdkami.

PS2: Ejjj... ta jedna linijka psuje program :P Ona dodaje w cholerę gwiazdek po wczytanym tekście :P
O to chodziło w przykładzie.
P-97362
Zdziwiony
Temat założony przez niniejszego użytkownika
» 2013-11-24 18:28:53
No chyba, że tak ;)

Jeszcze jedno pytanko, jak zapisać tę linijkę:
memset( bufor, '*', 1024 );

Żeby nie dodawała mi kilkudziesięciu gwiazdek do tekstu! :P
P-97363
MrPoxipol
» 2013-11-24 18:29:39
» standard Cmemset
Wypełnij zerami.
P-97364
Zdziwiony
Temat założony przez niniejszego użytkownika
» 2013-11-24 18:33:23
Przy takim kodzie:
C/C++
if( plik2.good() == true )
{
    std::cout << "Plik zostal otwarty pomyslnie!\nJego zawartosc zostala zaladowana ponizej:\n" << std::endl;
    char bufor[ 1024 ];
    plik2.read( bufor, 1024 );
    cout << bufor;
    cout << "\n";
} else std::cout << "Wystapil blad! Nie mozna otworzyc pliku!" << std::endl;

}
system( "pause" );
Wypełniłem plik trzema tysiącami znaków i zadziałał, z tym, że zostało wczytanych do programu ich mniej (nie liczyłem ile, ale przypuszczam, że jak zmienie wartość 1024 na więcej wyświetli się więcej)

EDIT:
Zwiększyłem to 1024 na 2000 i wczytało się więcej tekstu, a wszystko działa OK.
P-97367
Buby
» 2013-11-24 18:36:43
Jaki z tego wniosek? - wczytuj tekst do stringa za pomocą getline.
Unikniesz niebezpieczeństwa i zawsze wczytasz cały plik :)
P-97368
1 2 « 3 » 4
Poprzednia strona Strona 3 z 4 Następna strona