Zapis do pliku

0

Witam
Mam poki co banalny program, ktory tworzy baze danych, umozliwia zapis do pliku i pozniejszy odczyt z pliku. Ale chcialbym dodac opcje wydrukowania zapisanych do pliku danych, a w pliku zapisuja mi sie one w dosc dziwny sposob:
user image

sama funkcja zapisu wyglada tak (tylko nie czepiac sie ew. kiepskiej jakosci kodu, pisalem to dawno temu)

 void zapisz(char* nazwa)
{
current=root->Next;
FILE* stream;
stream=fopen(nazwa,"w+b");
do
{
fwrite(current,sizeof(PERSON),1,stream);
current=current->Next;
}
while(current!=NULL);
fclose(stream);
cout<<"Sukces";
_getch();
}

W jaki sposob zmodyfikowac ja, aby zapisywala dane do pliku w postaci typu:
user image

0

To zapisuj tak, a nie walisz surowo.

0

Co chcesz przez to powiedziec?

0

Zapisuj każde pole po kolei, a pomiędzy nimi dawaj przejście do nowej linii.

0

Czyli tak "z buta". ale fajnie by bylo, jakby cala funkcja zapisu byla dosc uniwersalna i zapisywala po prostu dana pozycje ze struktury niezaleznie od ilosci pozycji w strukturze.

0

Takie rzeczy tylko w erze ;) No może jeszcze w Javie, C#. Niestety w C/C++ nie ma refleksji.

0

No ok, zrobilem po kolei, testowo dla jednego chara i nadal wykrzacza mi txt.

 PERSON* nowa=new PERSON;
             cout<<"Podaj imie: ";
             cin>>nowa->FirstName;
             char temp[20];
             strcpy(temp,nowa->FirstName);
             PERSON* ostatni=GetLast();
             nowa->Next=NULL;
             ostatni->Next=nowa;
             
             
             current=root->Next;
             FILE* stream;
             stream=fopen("kiepscy.txt","w+b");
             fwrite(temp,sizeof(temp),1,stream);
             current=current->Next;
             fclose(stream);
             cout<<"Sukces";

i po wpisaniu przykladowo "Stefan" w pliku txt wyskakuje mi

Stefan w˙˙˙˙ăÂÁw¸Âw

0

Bo za dużo piszesz. W fwrite nie sizeof(temp) tylko strlen(temp)

0

Ok, dziala teraz juz wszystko tak jak ma dzialac :) Dzieki wielkie!

0

W zasadzie jeszcze jedno, jesli ktokolwiek ma cierpliwosc, bo sam do siebie juz nie mam nawet ;P
Jak wrzucic spacje albo enter?
Coby sie w pliku zapisalo np:
A B
C
a nie ABC ?

0

fragment pewnej strony:
\n Newline
\t Horizontal Tab
\v Vertical Tab
\b Backspace
\r Carriage Return
\f Form feed
\a Audible Alert (bell)
\ Backslash
? Question mark
' Single quote
" Double quote
\000 Oct - No one uses Octal unless they have an ICL background...
\xhh Hex number
...

0

Tak w ogóle, to plik nie powinien być w tym wypadku otwierany w trybie binarnym i dlaczego skoro piszesz w c++ nie używasz strumieni, tylko funkcji z biblioteki c?

0

Dzieki za komendy. A uzywam jak uzywam, tak sie nauczylem i tak mi wygodnie ;p
Dlaczego plik nie powinien byc otwierany w trybie binarnym (a tekstowym, tak?)? Wszystko ladnie dziala.
To jeszcze spytam moze ktos odpowie,bo sprawdzic to sprawdze dopiero w domu jak bede,czy znaki typu /n czyli enter to sa znaki rozpoznawane potem przez drukarke? Bo jak otwieram w pliku txt to jest tekst rozdzielony prostokatami,ok, ale pytanie jak to sie wydrukuje?

0

Też się źle wydrukuje. Otwieraj plik w trybie tekstowym bo zapisujesz tekst - dość proste ;)

A z tym wygodniej to nie wierzę, zamiast:

FILE* stream;
stream=fopen("kiepscy.txt","w+b");
fwrite(temp,sizeof(temp),1,stream);

można tak:

ofstream stream("kiepscy.txt");
stream << temp;
0

chyba wyświetla prostokąty bo wstawiłeś tylko line feed '\n' a pod windows powinien wystąpić wcześniej powrót karetki; czyli "\r\n" na koniec każdej lini
edit:
do obróbki plików używaj strumieni tak jak kolega wyżej napisał

0

na razie skupiam sie nad praca na jednym komputerze, co dopiero myslec o wielu systemach. Wroce do domu i sprawdze streamem, bo wydaje sie prostsze (a ja sie po prostu trzymam tego co nam wpoili na studiach;p). I teraz z tych dalszych wpisow juz sie pogubilem, jak wpisze \n to mi przejdzie na drukarce do nowej lini, czy wydrukuje kwadrat? W symfoni jest opisane kiedy binarnie a kiedy tekstowo, czy w jakies innej jego ksiazce?

0

To jak się wydrukuje na drukarce zależy od tego jak będziesz drukował. To program za to odpowiada. Jak dorwiesz jakiś ciekawy to np. wszystkie wystąpienia 'a' wydrukuje jako różyczki, a 'z' jako chryzantemy.
To są podstawy: w systemach unixowych przejście do nowej linii to jest znak LF ('\n'), w windowsach to jest zestaw dwóch znaków CR i LF ('\r' i '\n'). Skoro otworzyłeś plik w trybie binarnym to system się nie interesuje co do niego piszesz - już Twoja w tym głowa, żeby odpowiednio obsłużyć przejście do nowej linii. Jeżeli otworzysz w trybie tekstowym to w windowsach każde wystąpienie '\n' zostanie poprzedzone '\r'(jeżeli już nie jest) i nie będzie problemu z przejściem do nowej linii.

1 użytkowników online, w tym zalogowanych: 0, gości: 1