Skocz do zawartości
barlug

problem lamera z c++

Rekomendowane odpowiedzi

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

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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++

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

(...)

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.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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();

}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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]

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...