Föreläsningsanteckningar OOP-föreläsning 11, måndag 15 oktober 2007 =================================================================== Idag ==== 1. Inlämningsuppgiften om automatisk testning 2. Enkel inläsning: tal, tecken, C- och C++-strängar 3. Formatflaggor och manipulatorer 4. Textfiler med strömmar: fstream 5. Binärfiler med strömmar 6. Serialisering 1. Inlämningsuppgiften om automatisk testning ============================================= Hur man bäst gör automatisk testning Val av testfall 2. Enkel inläsning: tal, tecken, C- och C++-strängar ==================================================== las-tal.cpp ----------- #include using namespace std; int main() { double x; cout << "1. Enklaste inläsningen\n"; cout << "Skriv ett reellt tal x: "; cin >> x; // Här är talet x kanske inläst cout << "Talet var " << x << endl; cout << "2. Inläsning med en loop\n"; cout << "Skriv ett reellt tal x: "; cin >> x; while (!cin) { cin.clear(); cin.ignore(80, '\n'); cout << "Skriv ett reellt tal x: "; cin >> x; } // Här är talet x inläst, nästan säkert cout << "Talet var " << x << endl; cout << "3. Kanske bättre än ignore\n"; cout << "Skriv ett reellt tal x: "; cin >> x; while (!cin) { cin.clear(); while (cin.get() != '\n') // Inte: cin >> c ; cout << "Skriv ett reellt tal x: "; cin >> x; } // Här är talet x inläst, nästan säkert cout << "Talet var " << x << endl; cout << "4. En annan sorts loop\n"; cout << "Skriv ett reellt tal x: "; while (!(cin >> x)) { cin.clear(); while (cin.get() != '\n') ; cout << "Skriv ett reellt tal x: "; } // Här är talet x inläst, nästan säkert cout << "Talet var " << x << endl; cout << "5. Ännu en annan sorts loop\n"; while (cout << "Skriv ett reellt tal x: ", !(cin >> x)) { cin.clear(); while (cin.get() != '\n') ; } // Här är talet x inläst, nästan säkert cout << "Talet var " << x << endl; } las-tecken.cpp -------------- #include using namespace std; int main() { char c; cout << "Skriv ett tecken, och sen RETUR: "; cin.get(c); char junk = c; while (junk != '\n') cin.get(junk); while (c == '\n') { cout << "Skriv ett tecken, och sen RETUR: "; cin.get(c); char junk = c; while (junk != '\n') cin.get(junk); } cout << "Tecknet var '" << c << "' (teckenkod " << (int)c << ")\n"; do { cout << "Skriv ett tecken, och sen RETUR: "; cin.get(c); char junk = c; while (junk != '\n') cin.get(junk); } while (c == '\n'); cout << "Tecknet var '" << c << "' (teckenkod " << (int)c << ")\n"; } Dialog ------ Skriv ett tecken, och sen RETUR: Skriv ett tecken, och sen RETUR: Skriv ett tecken, och sen RETUR: kalle Tecknet var 'k' (teckenkod 107) Skriv ett tecken, och sen RETUR: olle Tecknet var 'o' (teckenkod 111) las-c-strang.cpp ---------------- #include using namespace std; int main() { char namn[30 + 1]; cout << "Skriv ett namn, och sen RETUR: "; cin.getline(namn, sizeof namn, '\n'); // Inte: c >> namn; while (namn[0] == '\0') { cout << "Skriv ett namn, och sen RETUR: "; cin.getline(namn, sizeof namn, '\n'); // Inte: c >> namn; } cout << "Namnet var '" << namn << "'\n"; } las-strang.cpp -------------- #include #include using namespace std; int main() { string namn; cout << "Skriv ett namn, och sen RETUR: "; getline(cin, namn); while (namn == "") { cout << "Skriv ett namn, och sen RETUR: "; getline(cin, namn); } cout << "Namnet var '" << namn << "'\n"; } 3. Formatflaggor och manipulatorer ================================== format.cpp ---------- #include using namespace std; int main() { cout << 50.2136 << endl; cout.precision(3); cout << 51.2136 << endl; cout << 52.2136 << endl; cout.setf(ios::fixed, ios::fixed | ios::scientific); cout << 53.2136 << endl; cout << 54.2136 << endl; cout.width(10); cout << 55.2136 << endl; cout << 56.2136 << endl; cout.unsetf(ios::fixed); cout << 57.2136 << endl; cout << 58.2136 << endl; } Utmatning --------- 50.2136 51.2 52.2 53.214 54.214 55.214 56.214 57.2 58.2 iomanip.cpp ----------- #include #include using namespace std; int main() { cout << 50.2136 << endl; cout << setprecision(3); cout << 51.2136 << endl; cout << 52.2136 << endl; cout << setiosflags(ios::fixed); cout << 53.2136 << endl; cout << 54.2136 << endl; cout << setw(10); cout << 55.2136 << endl; cout << 56.2136 << endl; cout << resetiosflags(ios::fixed); cout << 57.2136 << endl; cout << 58.2136 << endl; } Utmatning --------- 50.2136 51.2 52.2 53.214 54.214 55.214 56.214 57.2 58.2 4. Textfiler med strömmar: fstream ================================== summera-1.cpp ------------- #include #include using namespace std; int main() { double summan = 0; ifstream tsin("tal.txt"); if (!tsin) { cerr << "Kunde inte öppna filen 'tal.txt'.\n"; return 1; } double x; tsin >> x; while (!tsin.eof()) { summan += x; tsin >> x; } cout << "Summan är " << summan << endl; } summera-2.cpp ------------- #include #include using namespace std; int main() { double summan = 0; ifstream tsin("tal.txt"); if (!tsin) { cerr << "Kunde inte öppna filen 'tal.txt'.\n"; return 1; } double x; while (tsin >> x) summan += x; cout << "Summan är " << summan << endl; } 5. Binärfiler med strömmar ========================== komplex-fil-1.cpp ----------------- #include #include #include "komplex.h" using namespace std; int main() { KOMPLEX k; ofstream tsut("komplexa.txt"); if (!tsut) { cerr << "Kunde inte öppna filen 'komplexa.txt'.\n"; return 1; } cout << "Skriv komplexa tal och avlsuta med filslut." << endl; while (!(cin >> k).eof()) tsut << k; } komplex-fil-2.cpp ----------------- #include #include #include "komplex.h" using namespace std; int main() { KOMPLEX k; ofstream tsut("komplexa.txt"); if (!tsut) { cerr << "Kunde inte öppna filen 'komplexa.txt'.\n"; return 1; } cout << "Skriv komplexa tal och avlsuta med filslut." << endl; while (cin >> k) tsut << k; } komplex-fil-3.cpp ----------------- #include #include #include "komplex.h" using namespace std; int main() { KOMPLEX k; ofstream bsut("komplexa.dat", ios::binary); if (!bsut) { cerr << "Kunde inte öppna filen 'komplexa.dat'.\n"; return 1; } cout << "Skriv komplexa tal och avlsuta med filslut." << endl; while (cin >> k) bsut.write((char*)&k, sizeof(k)); } komplex-fil-4.cpp ----------------- #include #include #include "komplex.h" using namespace std; int main() { ifstream bsin("komplexa.dat", ios::binary); if (!bsin) { cerr << "Kunde inte öppna filen 'komplexa.dat'.\n"; return 1; } KOMPLEX k; KOMPLEX summan; while (bsin.read((char*)&k, sizeof(k))) summan = summan + k; cout << "Summa: " << summan << endl; } 6. Serialisering ================ person.h -------- #ifndef PERSON_H #define PERSON_H class Person { private: string namn; int alder; public: Person(string namn, int alder); Person(); friend ostream& operator<<(ostream& ut, Person& p); }; #endif person.cpp ---------- #include using namespace std; #include "person.h" Person::Person(string namn, int alder) { this->namn = namn; this->alder = alder; } Person::Person() { this->namn = "X"; this->alder = -1; } ostream& operator<<(ostream& ut, Person& p) { ut << p.namn << ", " << p.alder << endl; return ut; } person-fil-1.cpp ---------------- #include #include #include using namespace std; #include "person.h" int main() { Person p1("Göran", 57); Person p2("Fredrik", 41); cout << p1 << p2; cout << "Skriver Göran och Fredrik på binärfilen 'personer.dat'...\n"; ofstream bsut("personer.dat", ios::binary); bsut.write((char*)&p1, sizeof(Person)); bsut.write((char*)&p2, sizeof(Person)); bsut.close(); Person p3; Person p4; cout << "Hämtar Göran och Fredrik från binärfilen 'personer.dat'...\n"; ifstream bsin("personer.dat", ios::binary); bsin.read((char*)&p3, sizeof(Person)); bsin.read((char*)&p4, sizeof(Person)); cout << p3 << p4; } Utmatning --------- Göran, 57 Fredrik, 41 Skriver Göran och Fredrik på binärfilen 'personer.dat'... Hämtar Göran och Fredrik från binärfilen 'personer.dat'... Göran, 57 Fredrik, 41 person-fil-2.cpp ---------------- #include #include #include using namespace std; #include "person.h" int main() { Person p3; Person p4; cout << "Hämtar Göran och Fredrik från binärfilen 'personer.dat'...\n"; ifstream bsin("personer.dat", ios::binary); bsin.read((char*)&p3, sizeof(Person)); bsin.read((char*)&p4, sizeof(Person)); cout << p3 << p4; } Utmatning --------- Hämtar Göran och Fredrik från binärfilen 'personer.dat'... X, 57 X, 41