Portál AbcLinuxu, 2. srpna 2025 07:49


Dotaz: C++ promenna pro stdin

1.3.2011 15:31 MArty
C++ promenna pro stdin
Přečteno: 268×
Odpovědět | Admin
Dobry den,

program, ktery vytvarim muze svuj vstup nacitat bud ze souboru anebo ze stdin. To urcuje promenne ifileName do ktere pomoci getopt nacitam nazev vstupniho souboru. Pokud neni nazev vstupniho souboru zadan, je hodnota promenne ifileName NULL a cteme ze stdin. Nize uvadim kod, ktery toto resi. Jedna se defacto o skoro dva stejne bloky kodu, coz neni moc dobre. Muzete mi prosim poradit, jakym zpusobem tento fragment prepsat, abych oba bloku co nejvice sloucil? Nejlepe by bylo zavest jednu promennou, ktera by byla kompatibilni s ifstream i cin a z ni jednotne cetl znaky pomoci get().
    char *ifileName;
    ifstream ifile;

    ...

    // cteme ze stdin
    if (ifileName == NULL)
    {
        while (cin)
        {
            c = cin.get();
            if (c != EOF)
            {
                HTInsert(&HT, c);
            }
        }
    }
    // cteme ze souboru
    else
    {
        ifile.open(ifileName);
        if (ifile.is_open())
        {
            while (ifile.good())
            {
                c = ifile.get();
                if (c != EOF)
                {
                    HTInsert(&HT, c);
                }
            }
            ifile.close();
        }
    }

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

1.3.2011 15:46 Martin Tůma | skóre: 39 | blog: RTFM | Praha
Rozbalit Rozbalit vše Re: C++ promenna pro stdin
Odpovědět | | Sbalit | Link | Blokovat | Admin
http://www.abclinuxu.cz/poradna/programovani/show/146406
Každý má právo na můj názor!
1.3.2011 15:52 Sten
Rozbalit Rozbalit vše Re: C++ promenna pro stdin
Odpovědět | | Sbalit | Link | Blokovat | Admin
std::ifstream a std::cin mají společného předka, std::istream:
void ctiData(std::istream &stream)
{
   ...
}


if (ifileName == NULL) {
    ctiData(std::cin);
} else {
    std::ifstream file(ifileName);
    ctiData(file);
}
Btw. v Linuxu je standardní vstup dostupný jako /dev/stdin, tzn. lze udělat tohle:
std::ifstream file(ifileName ? ifileName : "/dev/stdin");

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.