//////////////////////////////////////////////////////////////////////////// // Sýnislausn á Forritunarverkefni 1 í Tölvunarfræði 2 // // Hjálmtýr Hafsteinsson, febrúar 2005 //////////////////////////////////////////////////////////////////////////// #include #include #include #include #include using namespace std; // Hámarksfjöldi stafa á eftir undanfara sem fundnir eru const int MAX_ESTAFIR = 1000; // Fallið FileSize skilar stærð skrárinnar sFileName í bætum // Það er engin aðferð í ifstream sem skila skráarstærðinni, svo // við neyðumst til að fara út í svona æfingar! int FileSize(const char* sFileName) { ifstream f; f.open(sFileName, ios_base::binary | ios_base::in); if (!f.good() || f.eof() || !f.is_open()) { return 0; } f.seekg(0, ios_base::beg); ifstream::pos_type begin_pos = f.tellg(); f.seekg(0, ios_base::end); return (f.tellg() - begin_pos); } // Opnar inntakstrauminn inn með skránni inntak og úttakstrauminn ut með skránni // uttak. Inntaksskráin er síðan lesin inní strenginn sbok. int opnaOgLesa( ifstream &inn, char inntak[], ofstream &ut, char uttak[], string &sbok ) { char* Bok; // Bókin á char-fylkisformi // Opna skránna með nafnið í strengnum inntak... inn.open( inntak ); if( !inn.is_open() ) { cout << "Tokst ekki ad opna " << inntak << endl; return 1; } // Opna úttaksskránna uttak.txt sem skrifað er í... ut.open( uttak ); if( !ut.is_open() ) { cout << "Tokst ekki ad opna " << uttak << endl; return 1; } // Lesa alla inntaksskránna inní strenginn Bok... int skraLen = FileSize(inntak); Bok = new char[skraLen+1]; inn.read(Bok, skraLen); sbok = string(Bok); return 0; } // Finnur alla stafi sem koma á eftir undan í bok og setja í char-fylkið eftir... void finnaEftirstafi( string &bok, string &undan, char eftir[], int &eftirLen ) { int i; eftirLen = 0; int upphaf = 0; while( (i = bok.find( undan, upphaf )) != -1 ) { if( eftirLen < MAX_ESTAFIR ) eftir[eftirLen++] = bok[i+undan.length()]; else return; upphaf = i+1; } } int main() { char inntak[30] = "njala.txt"; // Bókarnafnið (hér fest inni) char uttak[30] = "uttak.txt"; // Úttaksskráin (hér fest inni) string sBok; // Bókin á string-formi string sUndanfari; // Núverandi undanfara strengur int k; // Lengd undanfara int uttaksLengd; // Lengd úttaks char eStafir[MAX_ESTAFIR]; // Fylki fyrir stafi sem koma á eftir undanfara int eStafLen; // Fjöldi stafa í eStafir-fylkinu char valinnStafur; // Stafurinn sem valinn var úr eStafir-fylkinu ifstream inn; // Inntaksstraumurinn ofstream ut; // Úttaksstraumurinn int i, j, rnd; // Upphafsstilla slembitölugjafa... srand( (unsigned)time( NULL ) ); // Lesa inn viðeigandi gildi... cout << "Lengd undanfara (k): "; cin >> k; cout << "Lengd uttaks: "; cin >> uttaksLengd; cout << "Uttakid er skrifad i skranna uttak.txt" << endl; // Opna inntaks og úttaksskrár og lesa úr inntaksskránni í sBok strenginn if( opnaOgLesa( inn, inntak, ut, uttak, sBok ) != 0 ) return 1; // Velja fyrsta undanfarann... rnd = ( rand()*32768 + rand() ) % (sBok.length()-k-1); sUndanfari = sBok.substr( rnd, k ); for( i=0; i