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

[C++, fstream] Błędne wczytywanie danych z pliku

Ostatnio zmodyfikowano 2010-04-03 09:45
Autor Wiadomość
programator
Temat założony przez niniejszego użytkownika
[C++, fstream] Błędne wczytywanie danych z pliku
» 2010-04-03 00:38:56
Mam taki "dziwny" problem....
Otóż mam taki kawałek funkcji:
C/C++
temp = " ";
odczyt.open( plik.html );
if( odczyt.good() )
{
    getline( odczyt, temp, '~' ); //zapis całego pliku do temp
    odczyt.close();
} else cout << "Nie udało się otworzyć pliku" << endl;

cout << temp;
temp jest typu string.
odczyt to obiekt klasy ifstream.

Problem jest w tym, że to co wyświetla cout<<temp; nie zgadza się z treścią pliku:


//plik.html
<!--SZABLON-->
tutaj mam szablon
<!--/SZABLON-->
meta dla downloadu
<!--SZABLON-->
znowu szablon
<!--/SZABLON-->

prawidłowa treść strony

<!--SZABLON-->

szablon
<!--/SZABLON-->
A w programie dostaję wynik:

<!--SZABLON-->
tutaj mam szablon
<!--/SZABLON-->
meta dla downloadu
<!--SZABLON-->
znowu szablon
<!--/SZABLON-->

prawidłowa treść strony

szablonBLON-->
<!--/SZABLON-->
Dlaczego tak się dzieje? Jak temu zaradzić?
Używam code::blocks na ubuntu 9.10 kompilator gcc.
P-15741
DejaVu
» 2010-04-03 01:27:46
Kod, który wkleiłeś nie ma prawa działać, więc to nie jest kod, który masz w programie.

/edit:
A tak swoją drogą to nic po drodze się w tym kodzie nie dzieje, więc treść nie może ulec modyfikacjom. Mógłbyś również zapoznać się jak wczytywać prawidłowo zawartość plików ponieważ zakładanie, że jakiś znak nie wystąpi w pliku jest delikatnie mówiąc niezbyt profesjonalne.

PS. Poniższy kod 'działa' i nie ma tego błędu, o którym piszesz.
C/C++
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    string temp = " ";
    fstream odczyt;
    odczyt.open( "plik.txt", ios::in );
    if( odczyt.good() )
    {
        getline( odczyt, temp, '~' );
        odczyt.close();
    } else cout << "Nie udało się otworzyć pliku" << endl;
   
    cout << temp;
    return 0;
}
P-15743
programator
Temat założony przez niniejszego użytkownika
» 2010-04-03 08:29:11
A mi nie działa ten kod, który napisałeś, prawidłowo....
Nadal cout<<temp jest różne od zawartości pliku.....
Skompilowałem <b>tylko</b> to co napisałeś, otwierając plik "download.txt"
Jego treść:

<!--SZABLON-->
tutaj mam szablon
<!--/SZABLON-->
meta dla downloadu
<!--SZABLON-->
znowu szablon
<!--/SZABLON-->

prawidłowa treść strony

<!--SZABLON-->
szablon
<!--/SZABLON-->

Zawartość temp jest taka jak pisałem wcześniej....

/edit:
Mógłbyś przybliżyć, jak wczytać całą zawartość pliku, inaczej?
Bo czytałem rozdział operacje na plikach już tyle razy, że prawie na pamięć go znam:D
I najlepsza wydaje się ta metoda....

/edit2:
Zapisałem zmienną temp do nowego pliku i wszystko się zgadza!
Problem więc nie leż po stronie getline, czy string, lecz cout jest winne?
Nie rozumiem dlaczego tak się dzieje.
Zmienna temp ma poprawną zawartość pliku. Po wypisaniu na ekran nie jest taka, jaka być powinna...
P-15747
programator
Temat założony przez niniejszego użytkownika
» 2010-04-03 09:45:24
No nie!
Jak to możliwe, że zamiast \\n było \\r w pliku?
Tak czy siak, problem rozwiązany: zapisałem jeszcze raz treść pliku, w której wystąpił błąd i wyświetla się wszystko dobrze.

Przepraszam za ten temat, nie myślałem, że wina może leżeć po stronie pliku, choć wszystko wydawało się być dobrze...

Ale skoro już jesteśmy w temacie z getline, to bardzo chętnie poznałbym inny sposób (bardziej profesjonalny) na zapis treści całego pliku do stringu:)

/edit:
Ok, znalazłem:
http://www.elektroda.pl/rtvforum/topic1501529.html#7342373
Zdaje się być lepszym rozwiązaniem:)
Temat można wrzucić do kosza.
P-15749
« 1 »
  Strona 1 z 1