Rólam Tanulmányok és Oktatás Érdeklődési körök Munkák
| (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;
}
|
1.7.5.1