Kombinált bemenet

Rólam
   Főoldal
   Önéletrajzom
   Képek

Tanulmányok és Oktatás
   EAF1
   EAF3
   EAF4
   Fontkészlet
   PNY1
   PP
   ProgKör
   Visual Basic

Érdeklődési körök
   Linux
   Linux PalmLD
   RDiff

Munkák
   Önéletrajz
   CV in English




utolsó módosítás:
2010. augusztus 9.

(C) 2005 Zimler Attila Tamás <hijaszu@hlfslinux.hu>

A következő program csontváz képes arra, hogy különböző körülményektől függően a standard inputról vagy egy bemeneti állományból dolgozzon. A kódot a kódba illesztett megjegyzésekben magyarázom el. Előfordulhat, hogy fordítási hibát tartalmaz a kód, ebben az esetben írjátok meg nekem. (Persze jó volna ha a hibát is megírnátok.)

/*
    Header állományok és névterek használata:
Az iostreamben található a standard bemenet és kimenet kezelés, az fstreamben 
található az állományok kezeléséhez szükséges dolgok nagy része. String
kezeléshez még szükségünk van (ha akarunk stringet kezelni), a string headerre
is. Mindegyik standard header állomány az std névteret használja.
*/
#include <iostream>
#include <fstream>
using namespace std;

/*
    Következik az a függvény, amelyben kezdünk valamit az adatokkal. Itt már
nem tudjuk, hogy honnét történik a bemenet, tehát ez a kódrészlet már teljesen
környezetfüggetlen módon kell, hogy viselkedjen.
*/
void do_something(istream& is, ostream& os)
{
    // Beolvasunk valamit a bemenetről és kiírjuk a kimenetre, mondjuk egy
    // stringet
    string s;
    is >> s;
    os << s;
}

/*
    A programunk induló függvénye. A programnak át kell vennie a parancssori
paramétereket, ennek megoldására van neki két paramétere. Az argc paraméter
az argumentumok számát adja meg, az argv pedig magukat az argumentumokat.
Egy argumentumot mindenképpen kap a program, méghozzá azt az állománynevet,
ahogy el lett indítva.
*/
int main(int argc, char* argv[])
{
    if (argc < 2) /* csak az állomány nevet kaptuk, magyarul nincs paraméter */
	do_something(cin, cout);
    else /* végigmegyünk az összes paraméterként megadott állományon */
	for (int i = 1; i < argc; ++i)
	{
	    ifstream inp(argv[i]);
	    if (!inp)
		cerr << "Nem tudtam megnyitni az állományt" << argv[i] << endl;
	    else
		do_something(inp, cout);
	    /*
		Itt ugyan automatikusan lezáródik a bemeneti állomány, mivel a
		C++ meghívja az inp destruktorát, viszont EAF-on megkövetelik,
		hogy zárjuk be. Mivel ez a tulajdonsága a C++-nak nem biztos,
		hogy jelentkezik más nyelvben azért kell ide kiírni EAF-ban,
		mivel ott elvileg nem C++-t hanem minimális programozási
		logikát tanulunk.
	    */
	    inp.close();
	}
    return 0;
}