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

16.7. Poruszanie się po pliku z danymi

Ostatnio zmodyfikowano 2010-01-29 21:03
Autor Wiadomość
marek
Temat założony przez niniejszego użytkownika
16.7. Poruszanie się po pliku z danymi
» 2010-01-29 14:29:26
w pliku notka.txt jest "0123456789"
(zapisane pod najprostszym windowsowym edytorem "notepad")
W/g mnie po wykonaniu załączonego programu powinno wyświetlić się:
a 23456789
b 3456789
Natomiast wyświetliło się:
a 23456789
b 23456789

Dlaczego?

C/C++
#include <iostream>
#include <conio.h>
#include <fstream>
#include <cstring>
int main()
{
    std::fstream plik;
    std::string kartka;
    plik.open( "notka.txt", std::ios::in );
    if( plik.is_open() == true )
    {
        std::cout << "Uzyskano dostep do pliku!" << std::endl;
        plik.seekg( + 2, std::ios_base::beg );
        plik >> kartka;
        std::cout << "a " << kartka << "\n";
        plik.seekg( + 3, std::ios_base::beg );
        plik >> kartka;
        std::cout << "b " << kartka << "\n";
        plik.close();
    }
    else std::cout << "Dostep do pliku zostal zabroniony!" << std::endl;
   
    return( 0 );
}
P-13374
malan
» 2010-01-29 14:56:30
C/C++
#include <iostream>
#include <fstream>
int main()
{
    std::fstream plik;
    std::string kartka, kartka2;
    plik.open( "notka.txt", std::ios::in );
    if( plik.is_open() == true )
    {
        std::cout << "Uzyskano dostep do pliku!" << std::endl;
        plik.seekg( + 2, std::ios_base::beg );
        plik >> kartka;
        std::cout << "a " << kartka << "\n";
        plik.clear(); // Czyścisz flagi
        plik.seekg( 0, std::ios_base::beg ); // Ustawiasz wskaźnik pliku na początek
        plik.seekg( + 3, std::ios_base::beg );
        plik >> kartka;
        std::cout << "b " << kartka << "\n";
        plik.close();
    }
    else std::cout << "Dostep do pliku zostal zabroniony!" << std::endl;
   
    getchar();
    return( 0 );
}
P-13375
Elaine
» 2010-01-29 15:05:31
Sam clear wystarczy, nie trzeba ustawiać wskaźnika pliku na 0, żeby w kolejnej linii kodu zmieniać go na 3. Swoją drogą, kod się nie kompiluje - definicja std::string jest w <string>, które nie jest dołączone (a jeśli chodzi o kod @up, to podobna sytuacja ma miejsce z getchar() - stdio.h/cstdio nie są dołączone).
P-13376
malan
» 2010-01-29 15:28:51
[table]
[tr][th]IDE[/th][th]Kod*[/th][th]Stan[/th][/tr]
[tr][td]Dev-C++[/td][td]A[/td][td]OK[/td][/tr]
[tr][td]Dev-C++[/td][td]B[/td][td]OK[/td][/tr]
[tr][td]Code::Blocks[/td][td]A[/td][td]OK[/td][/tr]
[tr][td]Code::Blocks[/td][td]B[/td][td]OK[/td][/tr]
[/table]
*
-A -> Kod z kursu
-B -> Mój kod


Na MV nie mogę sprawdzić, bo nie mam go zarejestrowanego ;p.

//edit (20:04)
P-13377
Elaine
» 2010-01-29 15:55:58
U mnie, pod kompilatorem Microsoftu w wersji 16 (MSVC 2010), obydwa kody powodują wyświetlenie 39 KB error messagów. Prawdopodobnie powodem jest to, że standard nie precyzuje zależności między nagłówkami, więc biblioteka standardowa pod MSVC nie dołącza <string> do nagłówków iostreamowych (tak - nawet fakt, że strumienie mają cechowanie znaków niczego nie zmienia. Standard co prawda mówi, że char_traits jest w <string>, ale biblioteka może mieć char_traitsy włożone w oddzielnym pliku, który jest dołączany do <string> i nagłówków iostreamowych).

Dev-C++ i Code::Blocks to IDE, nie kompilatory. Powiedz, jakich kompilatorów użyłeś (takie C::B wspiera kilkanaście).
P-13378
marek
Temat założony przez niniejszego użytkownika
» 2010-01-29 16:33:02
Nie bardzo wiem co oznacza "czyszczenie flag", ale plick.clear() pomogło
Narazie na wiarę muszę przyjąć zasadę, że przed każdym przesunięciem wskaźnika trzeba zrobić plick.clear(). Prawdopodobnie flagi też trzeba czyścić w wielu innych sytuacjach .
Poza tym dzięki za odpowiedź.
P-13379
Elaine
» 2010-01-29 16:56:31
W tym przypadku trzeba czyścić, bo podczas czytania dotarliśmy do końca pliku. Nie trzeba tego robić zawsze przed przesunięciem wskaźnika w pliku.
P-13381
malan
» 2010-01-29 20:08:10
Jak wyszedłem to zdałem sobie sprawę, że słowo "Kompilator" tu nie pasuje. Już poprawiam :).

Co do kompilatorów to:
Dev-C++ -> MinGW (GCC),
CB -> GNU (GCC).
Mam nadzieje, że o to pytałeś.
P-13383
« 1 » 2
  Strona 1 z 2 Następna strona