Neeseem vaam nooviiiiinyy, poslooucheejte. Dnesnim ukolem bylo naprogramovat unixovsky CUT. parametry:
-b N = sloupce jsou retezce delky N znaku
-d ZNAK = sloupce jsou oddeleny ZNAKem, znak muze byt i "\t"
(mozna je jen jedna volba z -b/-d)
-f SLOUPCE = ktere sloupce vypsat (v pripade -d budou na vypise oddeleny delimiterem)
-o SOUBOR = output nebo stdout
SOUBOR = input nebo stdin
SLOUPCE maji nekolik moznosti, "a", "a-", "-b", "a-b" ... samozrejme jich muze bejt vic za sebou oddelenych carkou a vse se muze opakovat a tak ... cili napr. "5-,1,-3,3" je platne.
jo, a pokud je treba delimiter mezera a mam "a b", tak budou dva sloupce prazdny...
tot asi vse, na dve a pul hodky je to akorat .
Zapocet 20.1.2006
- MyS
- Donátor
- Příspěvky: 178
- Registrován: 22. 9. 2004 00:13
- Typ studia: Informatika Bc.
- Bydliště: The city of Dobříš
- Kontaktovat uživatele:
Zapocet 20.1.2006
We don't need no education!
- random
- Matfyz(ák|ačka) level II
- Příspěvky: 63
- Registrován: 30. 5. 2005 11:40
- Typ studia: Informatika Mgr.
- Kontaktovat uživatele:
Přikládám trošku zprasený zdroják
Kód: Vybrat vše
#include "stdafx.h"
#include <string>
#include <vector>
#include <utility>
#include <iostream>
#include <fstream>
using namespace std;
class parametry
{
public:
void setByte (int by) {b=by;}
int getByte () {return b;}
void setTyp (int typ) {t=typ;}
int getTyp () {return t;}
enum typ {neurceno, byte, znak};
vector<int> sloupce;//kdyz je cislo zaporne, znamena to ze jedem az do konce sloupce...
int b,t;
char odd;
};
vector<string> krajej(parametry p, string s)
{
vector<string> res;
if(p.t==parametry::byte)
{
while(s!="") {
res.push_back(s.substr(0, p.b));
if(s.length()>p.b)
s=s.substr(p.b, s.length());
else
s="";
}
} else {
int pos;
while( (pos=s.find(p.odd)) != s.npos)
{
res.push_back(s.substr(0, pos));
if(s.length()>pos+1)
s=s.substr(pos+1, s.length());
else
s="";
}
res.push_back(s);
}
return res;
}
string nactiRadek(istream& str)
{
string buf;
getline(str, buf, '
');
return string(buf);
}
string outFile;
typedef pair<int, string> isp;
isp prvniCislo(string s)
{
int res=0;
int last=s.find_first_not_of("0123456789");
if(last==0)
throw "argument nezacina cislem";
res=atoi(s.substr(0, last).c_str());
if(last==s.npos)
return isp(res, "");
else
return isp(res, s.substr(last, s.length()));
}
bool dosouboru=false;
bool zesouboru=false;
ofstream ofs;
ostream& soubor=ofs;
ostream& console=cout;
ifstream ifs;
istream& isoubor=ifs;
istream& iconsole=cin;
int main(int argc, char* argv[])
{
parametry par;//=rozparsuj(argc, argv);
par.t=parametry::neurceno;
for(int i=1;i<argc;i++)
{
string p(argv[i]);
if(p=="-o"){
if(i+1>=argc){
cout << "malo parametru" << endl;
return 1;
}
ofs.open(argv[++i]);
dosouboru = true;
if (!ofs.is_open()){ cout << "nelze otevrit vstupni soubor";
return 1; }
} else if(p=="-b"){
if(i+1>=argc){
cout << "malo parametru";
return 1; }
if (par.t == parametry::neurceno) par.t = parametry::byte;
else { cout << "Moc parametru";
return 1;
}
par.b=atoi(argv[i+1]);
i++;
} else if(p=="-d"){
if(i+1>=argc) {
cout << "malo parametru";
return 1; }
if (par.t == parametry::neurceno) par.t = parametry::znak;
else { cout << "Moc parametru";
return 1;
}
if (argv[i+1]=="\t") par.odd= '\t';
else par.odd = argv[i+1][0]; //berem prvni znak parametru za oddelovac
i++;
} else if(p=="-f") {
if(i+1>=argc){
cout << "malo parametru";
return 1; }
string v=argv[i+1];
while(v!="") {
if (v[0]=='-'){ v=v.substr(1,v.length());
isp vminus=prvniCislo(v);
for (int i=1; i<=vminus.first; i++) par.sloupce.push_back(i);
v = vminus.second;
v=v.substr(1,v.length());
continue;
}
isp vp=prvniCislo(v);
v=vp.second;
if(v==""){
par.sloupce.push_back(vp.first);
} else if(v[0]==',')
{
par.sloupce.push_back(vp.first);
v=v.substr(1, v.length());
} else if(v[0]=='-')
{
v=v.substr(1, v.length());
if(v!="" && isdigit(v[0])){
isp nvp=prvniCislo(v);
if(vp.first<=nvp.first)
for(int i=vp.first; i<=nvp.first; i++)
par.sloupce.push_back(i);
else
for(int i=vp.first;
i>=nvp.first; i--)
par.sloupce.push_back(i);
v=nvp.second;
} else {
par.sloupce.push_back(-vp.first);
}
if(v!="")
{
if(v[0]!=',')
throw "invalid field-string";
v=v.substr(1, v.length());
}
} else
throw "invalid field-string";
}
i++;
} else if (i==(argc - 1)) {
ifs.open(argv[i]);
zesouboru = true;
if(!ifs.is_open()) {
cout << "Nepodarilo se otevrit vstupni soubor";
return 1; }
}
else { cout << "Spatny argument"; return 1; }
}
if (par.t == parametry::neurceno) { cout << "malo parametru"; return 1; }
ostream& myout=dosouboru?soubor:console;
istream& myin=zesouboru?isoubor:iconsole;
while(!myin.eof())
{
string radek=nactiRadek(myin);
vector<string> kousky=krajej(par, radek);
bool prvni=true;
for(int i=0;i<par.sloupce.size(); i++)
{
int n=par.sloupce[i];
if(n==0) continue;
if(n<0)
{
for(int j=-n-1;j<kousky.size(); j++)
{
if(par.t==parametry::znak && !prvni)
myout<<par.odd;
myout<<kousky[j];
prvni=false;
}
} else {
if( (n-1) < (int)kousky.size() ) {
if(par.t==parametry::znak && !prvni)
myout<<par.odd;
myout<<kousky[n-1];
prvni=false;
}
}
}
if(!myin.eof())
myout<<endl;
}
return 0;
}
-
- Matfyz(ák|ačka) level III
- Příspěvky: 181
- Registrován: 24. 2. 2005 10:03
- Typ studia: Informatika Mgr.
- Login do SIS: reidj4am
- Kontaktovat uživatele:
to je mi jasnytutchek píše:uchylka je vetsinou dana lenosti odskrtnout ze nechces predkompilovany hlavickyqk píše:Nevim co je to za strasnou uchylku ze kazdej includuje stdafx.h??? (je mi jasny jak se to tam dostalo, ale to nic nemeni na tom, ze je to zvrhly)
dalsi vec kde se da neco zkazit a pak jak o zivot ladit
Don't worry, be dead