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

operacje na plikach

Ostatnio zmodyfikowano 2012-01-01 18:37
Autor Wiadomość
krzycho89
Temat założony przez niniejszego użytkownika
operacje na plikach
» 2011-12-28 20:14:04
WItam.
Czytam sobie stary kurs c++ wersje 2.0 a konkretnie obsluge plików
http://cpp0x.pl/kursy/Kurs-C++-v2-0/Obsluga-plikow/138
i nie pasuje mi kond związany z funkcją fail()

C/C++
std::fstream plik( "plik.txt", std::ios::in ); //zakładamy, że plik udało się otworzyć
plik.seekg( + 2, std::ios_base::end ); //skok do przodu o 2 względem końca pliku
if( plik.fail() ) std::cout << "Error! Nie udalo sie przesunac wewnetrznego wskaznika pliku" << std::endl;


EDIT:

Kompilując to zawsze fail() zwraca wartość 0 a przecież powinno zwrócić 1 i wyświetlić napis. A może to nie o to w tym chodzi i źle myśle?
Proszę o pomoc i wyjaśnienie tego bo nie ogarniam ;p
Z góry dzięki.
P-46527
SeaMonster131
» 2011-12-28 21:49:21
Funkcja zwróci true, (!= 0) jeżeli nie udało się przesunąć wskaźnika. Więc musisz zobaczyć jak ten plik wygląda, bo jeżeli wskaźnik się przesunie, to się napis nie pojawi :)
P-46536
krzycho89
Temat założony przez niniejszego użytkownika
» 2011-12-28 22:48:25
Nadal nie ogarniam. Pierwszy dział który sprawia tyle trudności. być może za długo już dzisiaj przy C++ siedze i skupić sie nie mogę.

W pliku txt nie wyskakiwało fail=1, faktycznie przeskoczył kursor o dużą ilość kiedy wpisałem w miejsce dwójki 800, a miejsca między starym tekstem a nowym ustawieniem kursora wypełnił spacjami.


Pojawił się nowy problem.
Program dopisuje (zamienia) tekst który wpisuje pod koniec pliku, ale jeśli dodam  polecenie które ma dopisać tekst do pliku parę instrukcji wcześniej to wyskakuje mi fail()=1 i nie zostanie dopisany ani jeden tekst (opisane poniżej komentarzami w kodzie) dlaczego tak się dzieje?
I dlaczego jak przestawiam wskaźnik wewnętrzny odczytu to zmienia sie tez wskaźnik zapisu?
Chciałbym w końcu tą obsługę plików ogarnąć bo już mnie ten dział zaczyna męczyć ;(.




C/C++
#include <iostream>
#include <string>
#include <fstream>

int main()
{
   
   
    std::string dane;
    std::fstream plik;
    plik.open( "heh.txt", std::ios::in | std::ios::out );
    std::cout << plik.is_open() << std::endl << "Pozycja\n";
   
    std::cout << "Gdzie wskazniki wewn, odczyt/zapis?\n";
    std::cout << plik.tellg() << std::endl; //wypisuje polozenie wewnetrzego wskaznika ktory czywa tekst z pliku
    std::cout << plik.tellp() << std::endl; //wypisuje polozenie wewnetrzego wskaznika ktory zapisuje tekst do pliku
    std::cout << "odczytuje dane z pliku dane:\n";
    plik >> dane;
    std::cout << dane << std::endl;
    plik << "jakis tekst"; //jak tego nie ma to fail()=0 i wczytuje do pliku tekst ponizej\/
    std::cout << "Gdzie wskazniki wewn, odczyt/zapis?\n";
    std::cout << plik.tellg() << std::endl;
    std::cout << plik.tellp() << std::endl;
    std::cout << "fail?" << plik.fail() << std::endl;
    plik.seekg( 0, std::ios_base::beg );
    plik << "0123456789"; //<<<<ten wlasnie tekst na końcu pliku dopisuje
    std::cout << "Gdzie wskazniki wewn, odczyt/zapis?\n";
    std::cout << plik.tellg() << std::endl;
    std::cout << plik.tellp() << std::endl;
    plik.close();
   
    return 0;
}
P-46541
pekfos
» 2011-12-29 10:05:12
C/C++
plik.seekg( 0, std::ios_base::beg );
plik << "0123456789";
Tak chciałeś na koniec się dostać? nie ta metoda, nie ta flaga..
P-46548
krzycho89
Temat założony przez niniejszego użytkownika
» 2011-12-29 15:57:54
Ok pomyłka, miało być:
plik.seekg( 0, std::ios_base::end );

Ale bardziej chodziło mi o to, że nie mogę dopisać tego 1 tekstu "jakiś tekst" bo wyskakuje fail()=1 i nie dopisuje się ani pierwszy ani drugi ciąg znaków...
P-46609
pekfos
» 2011-12-29 17:44:46
Ok pomyłka, miało być:
plik.seekg( 0, std::ios_base::end );
Wciąż pomyłka..
P-46618
krzycho89
Temat założony przez niniejszego użytkownika
» 2011-12-29 18:12:40
Hmm, no nic kombinuje dalej ;p
Na błędach się człowiek uczy najlepiej ;d
P-46622
krzycho89
Temat założony przez niniejszego użytkownika
» 2011-12-30 00:18:42
Nie mogę... Poddaje się. Gdzieś czytałem, że nie można łączyć std::ios:in z std::ios:out nie wyjaśniono dlaczego.
Gdzieś indziej czytałem o ifstream oraz ofstream i nimi należy majstrować przy plikach, a w lekcji o obsłudze plików jest festream, gdzie wczytano obydwa parametry ios::in oraz out. Ktoś może wyjaśnić jak "jeździć" po pliku? i dalczego moim kodzie raz wczytuje dane do pliku a raz nie? dlaczego po kompilacji czasami pokazuje mi wskaźniki w miejscu "-1".
Moge pominąć ten dział i zająć się czymś innym ale wolłym tego nie robić i opanować to zanim przejdę dalej...
P-46671
« 1 » 2
  Strona 1 z 2 Następna strona