• Medlem
  • Varberg
  • 2011-07-13 11:32

Håller på att slutföra en inlämningsuppgift till skolan men jag har ett problem som jag inte får till. Koden nedan fungerar förutom när jag skall "Lista alla filmer", om jag givit en film ett namn innehållande ett mellanslag så listas inte texten efter mellanslag. Är det någon som kan ge mig en ledtråd i rätt riktning vore det snällt. Denna fråga kommer även att ställas på MacWorldsforum eftersom jag inte vet hur många som är här och läser nu under sommaren.

/*
 Programmering B (PROC1408) – Inlämningsuppgift 2
 Skapa ett registerprogram som kan lagra information om filmer i en fil. Varje
 post i registret ska bestå av en struct. Programmet måste därför kunna hantera
 structer som består av typ och titel. Exempel på typ kan vara DVD, Blueray eller
 VHS. Programmet ska även kunna söka efter filmtitlar och därefter informera
 användaren om filmen finns, samt i vilket format den finns tillgänglig. Följande
 meny skall kunna användas i programmet:
 
 void meny()
 {
 cout<<"\\\\\\\\ Meny ////////"<<endl;
 cout<<"1. Lägg till film"<<endl;
 cout<<"2. Lista alla filmer"<<endl;
 cout<<"3. Sök titel"<<endl;
 cout<<"4. Avsluta "<<endl<<endl;
 cout<<"Ange val : ";
 }
//  main.cpp
//  InlaÃàmningsuppgift 2
//
//  Created by Johan Nilsson on 2011-07-09.
//  Copyright 2011 Consultec Byggprogram AB. All rights reserved.
*/

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <iomanip>
using namespace std;

struct Register {
    string titel;
    string typ;
};

void meny();
void nyPost(vector <Register>& mittRegister);
void skrivLista(vector <Register> mittRegister, char filnamn[]);
void sokResultat(vector<Register> resultatSokning, char filnamn[]);
ofstream utFil;
ifstream inFil;

int main (int argc, const char * argv[])
{
    vector <Register> mittRegister;
    bool fortsatt = true;
    int menyVal;
    cout << "Ange filens namn: ";
    char filnamn[30];
    cin.get(filnamn, 30);
    cin.ignore(1000, '\n');
    int antalPoster = 0;
    utFil.open(filnamn, ios::app);
    if (!utFil) {
        cout << "Filen går ej att öppna.";
        exit(1);
    }
    
    while (fortsatt == true) {
        meny();
        cin >> menyVal;
        cin.ignore(1000, '\n');
        switch (menyVal) {
            case 1:
                nyPost(mittRegister);
                for (int i = antalPoster; i < mittRegister.size(); i++) {
                    utFil << mittRegister.at(i).titel << '\t' << mittRegister.at(i).typ << endl ;
                    antalPoster++;
                }
                break;
            case 2:
                skrivLista(mittRegister, filnamn);
                break;
            case 3:
                sokResultat(mittRegister, filnamn);
                break;
            case 4:
                utFil.close();
                fortsatt = false;
                break;
            default:
                cout << "Felaktig inmatning.";
                break;
        }
    }
    
    
    
    return 0;
}

void meny()
{
    cout<<"\\\\\\\\\\\\\\ Meny ////////"<<endl;
    cout<<"1. Lägg till film"<<endl;
    cout<<"2. Lista alla filmer"<<endl;
    cout<<"3. Sök titel"<<endl;
    cout<<"4. Avsluta "<<endl<<endl;
    cout<<"Ange val : ";
}

void nyPost(vector <Register>& mittRegister)
{
    cout << "Avsluta inmatningen med #.\n";
    cout << "titel: ";
    Register nyRegisterPost;
    getline(cin, nyRegisterPost.titel);
    while (nyRegisterPost.titel != "#") {
        
    //Kontroll så att alla inmatade typer skrivs på samma sätt
    bool correct = false;
        do {
            cout << "Typ av media (DVD, Blueray, VHS): ";
            getline(cin, nyRegisterPost.typ);
            if (nyRegisterPost.typ == "DVD" || nyRegisterPost.typ == "VHS" ||nyRegisterPost.typ == "Blueray" || nyRegisterPost.typ == "#") {
                mittRegister.push_back(nyRegisterPost);
                correct = false;
            }
            else {
                cout << "Felaktigt format, försök igen. \n";
                correct = true;
            }

        } while (correct == true);

        
        cout << "titel: ";
        getline(cin, nyRegisterPost.titel);
    }
}

void skrivLista(vector <Register> mittRegister, char filnamn[])
{
    Register k;
    inFil.open(filnamn);
    //skapa 2 tomrader innan resultat
    for (int i = 0; i < 2; i++) {
        cout << '\n';
    }
    while (inFil >> k.titel) {
        inFil.ignore(1000, '\t');
        getline(inFil, k.typ);
        cout << setw(20) << left << k.titel  << left << k.typ << endl ;
    }
    //skapa 2 tomrader efter resultat
    for (int i = 0; i < 2; i++) {
        cout << '\n';
    }
    inFil.close();
}

void sokResultat(vector<Register> resultatSokning, char filnamn[])
{
    bool hittad = false;
    Register k;
    inFil.open(filnamn);
    cout << "Skriv in titeln du söker: \n";
    string soktTitel;
    string filmTyp;
    getline(cin, soktTitel);
    while (inFil >> k.titel) {
        inFil.ignore(1000,'\t');
        getline(inFil, k.typ);
        if (k.titel == soktTitel) {
            filmTyp = k.typ;
            hittad = true;
        }
    }
    if (hittad) {
        cout << "\nFilmen finns och har formatet " << filmTyp << '.' << endl ;
    }
    else{
        cout << "\nFilmen finns inte i registret.\n";
    }
    inFil.close();
}