flaga ios::app - jak to wlasciwie jest ??

0

Witam, mam takie male pytanie:

#include <iostream>
#include <fstream>

using namespace std;

int main() {
	
	fstream plik("p.txt", ios::in | ios::app);
	
	char t;
	
	plik << "w" << endl;
	plik.seekg(ios_base::beg);
	plik >> t;
	cout << t;
	
	
	plik.close();
	
	
	system("pause");
return 0;	
}

oto kod. Interesuje mni czy to przez flage ios::app nie moge odczytac znaku "w" ??
Czy istnieje sposob zeby otworzyc plik do odcztu i jednoczesnie do "dopisywania" (pomijajac deklaracje dwoch oddzielnych zmiennych ifstream i ofstream) ??

0

sprobuj zmienic ios::app na ios::ate i usun ios::in

0
  1. Nie sprawdzasz błędu po otwarciu pliku.
  2. Co rozumiesz jako dopisywanie? Append? Czyli ustawianie się na koniec przed każdym zapisem? Nie ma takiego trybu gdzie jednocześnie jest in i app

user image

//++
O ile standard tego nie przewiduje, to np. Rogue Wave Standard C++ Library posiada możliwość otwarcia pliku z flagami in|out|app ("a+" w cstdio)
http://www.roguewave.com/support/docs/sourcepro/stdlibug/30-3.html
M$ VC++ 6 też nie protestuje...
libstd++ trzyma się standardu.
STLport - nie wiem (raczej standardowo?).

0

Otoz mozna otwierac plik jednoczesnie do zapisu i odczytu z flagami ios::in i ios::out. Np:

#include <iostream>
#include <fstream>

using namespace std;

int main() {
	
	fstream plik("p.txt", ios::in | ios::out);
	
	char t;
	
	plik << "w" << endl;
	plik.seekg(ios_base::beg);
	plik >> t;
	cout << t;
	
	
	plik.close();
	
	
	system("pause");
return 0;	
}

jest to mozliwe gdyz obiekt fstream dziedziczy z klasy iostream, ktora obsluguje zarowno standardowe wejscie jak i wyjscie:
http://www.cplusplus.com/ref/iostream/fstream/
Jest to rowniez w "Symfonii C++" str. 21.14.1 Otwieranie i zamykanie strumienia. Tylko ze ios::out domyslnie wywoluje ios::trunc, a tego chce uniknac :/ .

0
DzieX napisał(a)

Otoz mozna otwierac plik jednoczesnie do zapisu i odczytu z flagami ios::in i ios::out.
(...)
Tylko ze ios::out domyslnie wywoluje ios::trunc, a tego chce uniknac :/

Sam out owszem, ale nie in|out => "r+" update read/write
Jeśli plik istnieje to zostanie otwarty do zapisu i odczytu, bez truncate.
Jeśli nie istnieje to błąd otwarcia.

in|out|trunc => "w+" truncate or create file for update
Jeśli plik istnieje to zostanie wykasowana jego zawartość i otwarty do zapisu i odczytu.
Jeśli nie istnieje to zostanie utworzony pusty.

BTW: nadal nie sprawdzasz błędu po otwarciu??

0
marcinEc napisał(a)

BTW: nadal nie sprawdzasz błędu po otwarciu??

może nie wie jak :D :D

Za parę dni będzie pytanie na forum czemu mi się coś tam dzieje!

if(!plik)
{ 
cout<<"bład przy otwieraniu pliku"
//teraz cos z tym zrób
}

Nie lekceważ tego MarcinEc ma racje

0

Raczej wiem, i wyobraz sobie ze blad sie nie pojawia !! :-/

0
DzieX napisał(a)

Raczej wiem, i wyobraz sobie ze blad sie nie pojawia !! :-/

Ale wyobraź sobie że taki błąd może kiedyś się pojawić i twój program sobie bez tego z nim nie poradzi.

Na studiach wykładowca zawsze powtarzał "Nieważne jaki program,musi on być idiotoodporny" Zawsze trzeba przewidzieć wyjątki.

0

Posluchaj (a wlasciwie przeczytaj :P ), wiem ale to w ogóle nie dotyczy tematu...

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