Operacje z plikami dyskowymi - problemy


(Salazaar) #1

MAm problem z operacjami zapisu odczytu i zamkniecia pliku

#include 

#include 

#include 

using namespace std;

int main()

{

    string zapis;

    cin >> zapis;

 fstream plik_zapis;


    plik_zapis.open("C:\Dev-Cpp1\zoom.txt.txt", ios::out | ios::binary);


    plik_zapis.close ();


     cin.ignore();

              cin.get();

    return 0;

              system("pause");

    }

takie:

11:22 C:\Dev-Cpp1\fileopen.cpp [Warning] unknown escape sequence '\D'

11:22 C:\Dev-Cpp1\fileopen.cpp [Warning] unknown escape sequence '\z'

12 C:\Dev-Cpp1\fileopen.cpp no matching function for call to `std::basic_fstream >::write(std::string&)'

note C:\Dev-Cpp\include\c++\3.4.2\bits\ostream.tcc:360 candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::write(const _CharT*, std::streamsize) [with _CharT = char, _Traits = std::char_traits]

Moglby mi ktos poprawic moj kod tak, zeby wszystko bylo poprawnie? Z gory dzieki

Złączono Posta : 28.03.2007 (Sro) 20:42

Dobra juz dziala, mam teraz inne pytanie. Bo jak zapisuje cos do pliku, i potem zapisuje jeszcze raz to poprzedni wpis sie kasuje. Jak zrobic, zeby tamten wpis sie nie kasowal ale byl linijke pod poprzednim?


(Sawyer47) #2

Nie potrafisz czytać?

unknown escape sequence '\D'

unknown escape sequence '\z'

Chyba wiesz co to jest np: '\n' ? Znak przejścia do nowej linii. backslash służy do wpisywania specjalnych znaków, żeby wpisać go jako literę należy użyć konstrukcji: '\' , tak samo wpisuje się apostrof, cudzysłów, NULL, znak zapytania. Tak więc poprawa na: "C:\Dev-Cpp1\zoom.txt.txt".

Sqlazack może jednak kupisz sobie jakąś dobrą książkę do nauki C++? Bo to są naprawdę podstawy. Jeżeli żal ci kasy, to chociaż poczytaj to: http://it.hk.pl/


(Salazaar) #3

Mam książkę. Ale skąd mam wiedzieć co to jest

unknown escape sequence '\z'

skoro nie ma tak zadnego sequence \z

Złączono Posta : 28.03.2007 (Sro) 20:58

Dobra juz dziala, mam teraz inne pytanie. Bo jak zapisuje cos do pliku, i potem zapisuje jeszcze raz to poprzedni wpis sie kasuje. Jak zrobic, zeby tamten wpis sie nie kasowal ale byl linijke pod poprzednim?


(Sawyer47) #4

Połączone tryby ios::out oraz ios::app

ios::out | ios::app

To powiedz jaką książkę masz? ;0 A przeczytałeś ją choć raz?]

edit: pomyłka, oczywiście out , dla in plik musi wcześniej istnieć i służy do czytania...

możesz też użyć kombinację ios::out | ios::ate


(Salazaar) #5

Napisałeś na poczatku ios::out i ios::app a potem ios::in i ios::app Prosze o przyklad na kodzie

//...........

 plik_zapis.open("C:\\Dev-Cpp1\\zoom.txt.txt", ios::out | ios::binary);

    plik_zapis.write(zapis.c_str(), zapis.size());


    plik_zapis.close ();

(Sawyer47) #6
plik_zapis.open("C:\\Dev-Cpp1\\zoom.txt.txt", ios::out | ios::app | ios::binary);

No i teraz jak masz string to możesz tak jak ty to zrobiłeś, nie wiem czy czasem nie da się w prostszy sposób:

plik_zapis << zapis; // Nie jestem pewien czy da się tak również ze stringami

Chyba się da :wink:


(Ryan) #7

Żeby zrozumieć jakiś tekst należy... przeczytać go ze zrozumieniem. Problem pojawił się w linii z ciągiem znaków i dotyczył ciągu \z - wystarczyło zerknąć do ksiażki, poradnika albo FAQ i przeczytać kilka stron o konstruowaniu ciągu znakowego.

Nie da się bo plik jest do odczytu.

::out - odczyt

::in - zapis

::app - na końcu pliku (dla zapisu)

::binary - w trybie binarnym

Jeśli to plik tekstowy to nie ma sensu otwierać go w trybie binarnym. Jeśli chcesz zapisywać - otwórz z in (jeśli dopisywać z in i z app). Jeśli chcesz czytać - z out. Jeśli zapis i odczyt - poczytaj trochę.


(Salazaar) #8

OK< teraz dopisuje. le jest problm, ze to wszystko nie jest oddzielone, znaczy sie jest jedno zaraz obok drugiego, np: to trzech wpisach, ala, kot, vacek pojawia sie w pliku zoom.txt alakotvacek. Jak zrobic, zeby kazdy kolejny wpis byl od nowej linii?


(mktos) #9

Dodaj "sztucznie" enter po zapisaniu każdej rzeczy. Przejście do nowej linii w Windows to \r\n.


(Salazaar) #10

Jak to zrobic? Gdzie wpisac?

string zapis;

    cout << "Type what would you like to save\t";

    cin >> zapis;

 fstream plik_zapis;


    plik_zapis.open("C:\\Dev-Cpp1\\zoom.txt.txt", ios::out | ios::app | ios::binary);

    plik_zapis.write(zapis.c_str(), zapis.size());


    plik_zapis.close ();

Złączono Posta : 29.03.2007 (Czw) 16:52

i drugie pytanie. Jaki jest kod na odczytanie i wyświetlenie na ekran zawartości pliku zoom.txt ? Prosze o pomoc


(Ryan) #11

plik_zapis.write("\n", zapis.size());

przed

plik_zapis.close ();

Odczytujesz przy pomocy .read. Musisz otworzyć (open) plik z odpowiednimi atrybutami (opisałem wcześniej) i odczytać (.read) dane z niego do stringa a następnie wypluć string na ekran przy pomocy cout.

Druga darmowa porada dla Ciebie: skoro masz książkę - przeczytaj ją! Najlepiej ze zrozumieniem.