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? #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 ); } |
|
malan |
» 2010-01-29 14:56:30 #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(); plik.seekg( 0, std::ios_base::beg ); 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 ); }
|
|
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). |
|
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) |
|
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). |
|
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ź.
|
|
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. |
|
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ś. |
|
« 1 » 2 |