barlug Opublikowano 13 Października 2004 Zgłoś Opublikowano 13 Października 2004 oto on(jestem lama): jaka jest roznica w zapisie bo niestety nie moge skumac , mam rozne zrodła oba podaja co innego. czy mozecie pomoc?please wiec chodzi o operacje na plikach 1. zrodlo: otwarcie pliku : zmienna=open("c:plik.txt",O_WRONLY); zmienna=open("c:plik.txt",O_RDONLY); WIEM ZE CHODZI O OTWARCIE W TRYBIE DO ZAPISANIA I DO ODCZYTU czy tworzenie np: zmienna=creat("c:plik.txt",S_WRITE); 2. zrodlo: char nazwap[]="test.txt", temp[256], c; FILE *fp; // otwarcie pliku do odczytu fp=fopen(nazwap, "rt"); i: pobranie tekstu (fgets(temp, 256, fp)) i: zamkniecie pliku fclose(fp); Wiem co oznaczaja dane funkcje i wiem czemu sluzy zapis:FILE *fp Natomiast czemu i kiedy uzywa sie takich zapisaow jak w wersji 1 a takich jak w wersji 2?! czy moze powinienem zmienic podrecznik.??:((( i jeszcze jedno , teraz z innej beczki: czy taki zapis jest prawdlowy?: int a; char bufor[256]; ... ifstream plik; //do odczytu plik.open("test.txt"); ... plik >> a; //wczytanie z pliku zmiennej typu int plik >> bufor; //wczytanie łańcucha znaków ... plik.close(); czy nie powinno byc: plik.cin>>a ??? sory ale troche mi sie pomieszalo Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
lcf Opublikowano 13 Października 2004 Zgłoś Opublikowano 13 Października 2004 masz przykladowa funkcje w ISO C++ do kopiowania plikow w trybie binarnym (ios::binary), otwieranie do odczytu i zapisu mozesz sobie looknac jak na strumieniach plikowych mozna zrobic: #include <iostream>#include <fstream>int kopiujPlik(char* nazwaPlikuWe, char* nazwaPlikuWy) { using namespace std; ifstream plikWe(nazwaPlikuWe, ios::in | ios::binary); ofstream plikWy(nazwaPlikuWy, ios::out | ios::binary); if(!plikWe) { cerr << "Nie moge otworzyc pliku " << nazwaPlikuWe; return 1; } if(!plikWy) { cerr << "Nie moge otworzyc pliku " << nazwaPlikuWy; return 1; } plikWy << plikWe.rdbuf(); return 0;} PS twoje dwa pierwsze przyklady to z funkcjami z biblioteki standardowej ANSI C sa (z tego co pamietam), nie C++ Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
barlug Opublikowano 13 Października 2004 Zgłoś Opublikowano 13 Października 2004 czyli tak: FILE *fp; // otwarcie pliku do odczytu fp=fopen(nazwap, "rt"); a nie tak: zmienna=open("c:plik.txt",O_WRONLY); Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
marcinEc Opublikowano 16 Października 2004 Zgłoś Opublikowano 16 Października 2004 (...) jaka jest roznica w zapisie bo niestety nie moge skumac , mam rozne zrodła oba podaja co innego. czy mozecie pomoc?please wiec chodzi o operacje na plikach [...cut...] Wiem co oznaczaja dane funkcje i wiem czemu sluzy zapis:FILE *fp Natomiast czemu i kiedy uzywa sie takich zapisaow jak w wersji 1 a takich jak w wersji 2?! czy moze powinienem zmienic podrecznik.??:((( Faktycznie musisz mieć drętwy podręcznik albo dokładniej go czytaj :> Otóż funkcje pochodzące z biblioteki standardowej 'stdio.h' (czyli: fopen, fread, fclose, itp.) MUSZĄ (powinny :-) ) być w każdym kompilatorze. Najprościej powiedzieć, że są w każdym szanującym się kompilatorze języka C/C++, a także, że funkcje te bedą działać pod DOSem, pod UNIXem, pod Windows, i są w standardzie ANSI C. Natomiast funkcje open czy creat pochodzą z biblioteki 'io.h', która jest biblioteką na niższym poziomie, bardziej zależną od systemu operacyjnego. Nikt nie zabroni, ani nie może Ci nakazać stosowania ktorejś z ww. bibliotek ale RADZĘ stosować standardowe rozwiązanie z 'stdio.h'. Pamiętaj też, że w C++ możesz stosować strumienie (tak jak napisał lcf). i jeszcze jedno , teraz z innej beczki: czy taki zapis jest prawdlowy?: int a; char bufor[256]; ... ifstream plik; //do odczytu plik.open("test.txt"); ... plik >> a; //wczytanie z pliku zmiennej typu int plik >> bufor; //wczytanie łańcucha znaków ... plik.close(); czy nie powinno byc: plik.cin>>a ??? sory ale troche mi sie pomieszalo Pomyśl chwilę... Skoro cin jest standardowym strumieniem wejściowym, to czy możesz coś takiego napisać w ogóle? Spójrz także na to wyrażenie od strony języka: kropka oznacza dostęp do składowej obiektu, czy cin jest składową obiektu plik? Nie wydaje mi się... Sam otworzyłeś własny strumień wejściowy podłączony do pliku i z niego czytasz. Tu jeszcze przyczepiłbym się do wczytaywania łańcucha znaków do bufora o ograniczonym rozmiarze. Co jeśli znaków będzie więcej niż 256? Program może się wywalić...(btw. jest to typowy bląd wykorzystywany przy włamywaniu się do komputerów :-). Akurat w tym przypadku zalecane jest użycie funkcji fgets (lub innej), która kontroluje rozmiar bufora przeznaczonego na łańcuch znakowy i nie pozwoli na wczytanie większej ilości znaków. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
barlug Opublikowano 20 Października 2004 Zgłoś Opublikowano 20 Października 2004 oki dzieki zomtywowałeś mnie troche i po 2 dziach skumalem w koncu (tak mi sie wydaje)..tylko jest pewein problem .programik poniżej mial wpisywac krotki ciag zankow do pliku i pozniej odczytac z pliku 1 linijke i wyswietlic ja na ekranie .wszystko jest oki do mometnu wyswietlania. plik tworzy i zapisuje do niego wartosc. natomiast zamiast odczytu jest 0x0000000 :( please help #include <iostream.h> #include <fstream.h> #include <conio.h> #include <stdio.h> main() { ifstream plik2; ofstream plik; char nazwa[]="proba.txt"; char x[20]; cout<<"zaczynamy"; plik.open(nazwa,ios::out); if (!plik){ cout<<"kupa nie udalo sie";} else { cout<<"podaj x ktory zostanie zapisany do plikun"; cin>>x; plik<<x; } plik2.open(nazwa,ios::nocreate); if (!plik2){ cout<<"nie udalo sie otworzyc plik2";} else { cout<<"czytam zawartoscn"; //plik2.getline(x,sizeof(x)); cout<<plik2.getline(x,sizeof(x)); getch(); } plik.close(); plik2.close(); } Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
marcinEc Opublikowano 23 Października 2004 Zgłoś Opublikowano 23 Października 2004 No tak. 1. W drugiej części programu ma być: [php:1:4d71eb58ea] plik2.getline(x,sizeof(x)); cout << x; [/php:1:4d71eb58ea] zamiast [php:1:4d71eb58ea]cout<<plik2.getline(x,sizeof(x));[/php:1:4d71eb58ea] Chcesz przecież wydrukować bufor x, odczytany przez getline. 2. ZAMKNIJ plik po zapisaniu do niego wartości! Operujesz na tym samym pliku! Najpierw do niego zapisujesz i musisz zamknąć - zapewni to zapisanie fizyczne (bo tak naprawdę system używa cache'u czyli pamięci komputera do przechowywania pliku przy zapisie i odczycie). Dopiero wtedy plik się zmieni i ponowne otwarcie i odczyt będzie działać prawidłowo. Rozumiesz? Czyli przed linijką: plik2.open(nazwa,ios::nocreate); musisz dopisać plik.close(); a z końcówki programu to wywalić. 3. Pomyliły Ci się sposoby dostępu do plików/strumieni :> Nie widziałeś, że za drugim razem plik nie jest otwierany (ponieważ już BYŁ otwarty do zapisu), gdyż takie sprawdzenie if (!plik2) {} wcale nie sprawdzi czy plik jest otwarty. W tym wypadku plik2 jest obiektem już istniejącym (od chwili deklaracji, czyli: ifstream plik2;). Sprawdzenie powinno polegać na wywołaniu odpowiedniej metody dla obiektu typu ifstream, czyli is_open(). Jeżeli zwraca true to plik jest otwarty. Czyli: [php:1:4d71eb58ea] plik.open(nazwa,ios::out); if ( plik.is_open()==false ) { cout<<"kupa nie udalo sie"; } [/php:1:4d71eb58ea] Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
barlug Opublikowano 24 Października 2004 Zgłoś Opublikowano 24 Października 2004 dzieki zaraz to sprawdzam pozdrawiam Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...