Atenţie! Aceasta este o versiune veche a paginii, scrisă la 2016-08-25 18:03:14.
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ă:

class OutputPrinter
{
public:
    OutputPrinter () {}
    OutputPrinter (char *file_name) {output_file = fopen (file_name, "w"); memset (sir, 0, sizeof (sir));}
    OutputPrinter &operator << (int val)
    {
        int cif[15];
        cif[0] = 0;
        if (val == 0) cif[0] = 1, cif[1] = 0;
        while (val) cif[++cif[0]] = val % 10, val /= 10;
        for (int i=cif[0]; i>=1; i--)
            sir[pos ++] = cif[i] + '0';
        if (pos >= max_l) CheckFinish ();
        return *this;
    }
    OutputPrinter &operator << (char c)
    {
        sir[pos ++] = c;
        if (pos >= max_l) CheckFinish ();
        return *this;
    }
    OutputPrinter &operator << (char *str)
    {
        while (*str)
        {
            sir[pos ++] = *str, str ++;
            if (pos >= max_l) CheckFinish ();
        }
        return *this;
    }
    ~OutputPrinter () {fprintf (output_file, "%s", sir);}
private:
    FILE *output_file;
    static const int max_l = 50000;
    int pos = 0;
    char sir[max_l + 20];
    void CheckFinish () {fprintf (output_file, "%s", sir), pos = 0, memset (sir, 0, sizeof (sir));}
};