Atenţie! Aceasta este o versiune veche a paginii, scrisă la 2016-08-25 18:34:19.
Revizia anterioară   Revizia următoare  

Parsarea fişierului de ieşire

Aşa cum puteţi vedea aici, parsarea intrării este foarte avantajoasă când este nevoie să salvăm timp la execuţie. Deşi mai rar întâlnită, parsarea ieşirii se poate dovedi şi ea utilă în multe cazuri. Ca şi în materialul precedent, vom oferi bucăţi de cod exemplu, atât pentru varianta funcţională (compatibilă cu limbajul C), cât şi pentru cea obiectuală (compatibilă cu C++, asemănătoare cu sintaxa cout).

Cod compatibil cu limbajul C++ şi sintaxa <fstream> (obiectual)

Acesta este un cod demonstrativ pentru parsarea fişierului de ieşire folosind metoda obiectuală:

#include <stdio.h>

class OutParser {
private:
	FILE *fout;
	char *buff;
	int sp;

	void write_ch(char ch) {
		if (sp == 4096) {
			fwrite(buff, 1, 4906, fout);
			sp = 0;
			buff[sp] = ch;
		} else {
			buff[sp++] = ch;
		}
	}


public:
	OutParser(const char* name) {
		fout = fopen(name, "w");
		buff = new char[4096]();
		sp = 0;
	}
	~OutParser() {
		fwrite(buff, 1, sp, fout);
		fclose(fout);
	}

	OutParser& operator << (int vu32) {
		if (vu32 <= 9) {
			write_ch(vu32 + '0');
		} else {
			(*this) << (vu32 / 10);
			write_ch(vu32 % 10 + '0');
		}
		return *this;
	}
	
	OutParser& operator << (long long vu64) {
		if (vu64 <= 9) {
			write_ch(vu64 + '0');
		} else {
			(*this) << (vu64 / 10);
			write_ch(vu64 % 10 + '0');
		}
		return *this;
	}

	OutParser& operator << (char ch) {
		write_ch(ch);
		return *this;
	}
	OutParser& operator << (const char *ch) {
		while (*ch) {
			write_ch(*ch);
			++ch;
		}
		return *this;
	}
};

Cum folosim acest cod?

Aveţi mai jos un exemplu care urmează sintaxa fstream:

int main()
{
	OutParser fout("exemplu.out");
	fout << 324 << "sdfjhj 87473hriufhe" << '\n' << 638274623846 << '\n'; // !!! endl nu funcţionează, şi oricum şi în fstream este lent. Folosiţi '\n'.
	return 0;
}