Avatar billede martinbk Nybegynder
08. juli 2003 - 21:56 Der er 12 kommentarer og
1 løsning

Nybegynderleg med I/O streams

hejsa jeg har fået en opgave stillet, som går på I/O streams, opgaven indebærer jeg skal skrive et program hvor brugeren kan vælge om han vil skrive til en fil eller liste indholdet af filen, jeg skal udover bruge minimum en struct og en extern funktion (uden for main funktionen) dette går også meget fint, problemet opstår når jeg forsøger at indsætte data i min txt fil, den springer simpelthen min cin.getline over og så terminerer programmet med en fejl håber nogen kan forklarer mig hvorfor dette sker
på forhånd tak :)

lidt kode:


#include <fstream.h>
#include <stdio.h>

void udskriv(ostream* ud, char *filnavn)
{
    char linie[128];
    ifstream read(filnavn);
   
  while (read && ! read.eof())
    {
        read.getline(linie, 128);
        *ud << linie << endl;
    }
}

void main()
{
    ostream* os;
    cout << "Hvad vil du foretage dig?" << endl;
    cout << "I)ndsætte Data i tlf listen" << endl;
    cout << "L)iste Data fra tlf listen" << endl;
    char choice = getchar();
    fstream liste("liste.txt", ios::out | ios::app);
    if (choice == 'I') {
      struct data {char navn[30]; int alder; int tlfnr;};
      data d;
      cout << "Indtast personens navn: " << endl;
      cin.getline(d.navn, 30);
      cout << "Indtast personens alder: ";
      cin >> d.alder;
      cout << "Indtast personens tlf nr: ";
      cin >> d.tlfnr;
      liste << d.navn << " ";
      liste << d.alder << " ";
      liste << d.tlfnr << endl;
      cout << "Data er nu indsat" << endl;
    }
    else {
        os = &cout;
        udskriv(os,"liste.txt");
    }
if (os != &cout) delete os;
}
Avatar billede arne_v Ekspert
08. juli 2003 - 22:00 #1
Gæt: du skal have lukket liste i main inden du kan åbne filen
igen i udskriv.
Avatar billede arne_v Ekspert
08. juli 2003 - 22:02 #2
Noget a la:

    if (choice == 'I') {
      fstream liste("liste.txt", ios::out | ios::app);
      struct data {char navn[30]; int alder; int tlfnr;};
      data d;
      cout << "Indtast personens navn: " << endl;
      cin.getline(d.navn, 30);
      cout << "Indtast personens alder: ";
      cin >> d.alder;
      cout << "Indtast personens tlf nr: ";
      cin >> d.tlfnr;
      liste << d.navn << " ";
      liste << d.alder << " ";
      liste << d.tlfnr << endl;
      cout << "Data er nu indsat" << endl;
      liste.close();
    }
Avatar billede martinbk Nybegynder
08. juli 2003 - 22:02 #3
udskriv funktionen bliver jo slet ikke kaldt når jeg giver min getchar() et I for at indsætte data, problemet ligger i den blot springer den første post over og beder om alder
Avatar billede arne_v Ekspert
08. juli 2003 - 22:03 #4
Et par side-bemærkninger:

jeg ville undgå at blande getchar og cin

jeg kan ikke gennemskue hvad os bliver brugt til
Avatar billede arne_v Ekspert
08. juli 2003 - 22:05 #5
Måske er det så getchar og cin blandingen der driller dig.

Kan du ikke erstatte den getchar med cin ?
Avatar billede martinbk Nybegynder
08. juli 2003 - 22:10 #6
som sagt jeg er meget ny i C(++) forslag til en bedere løsning er skam velkommen
Avatar billede razersedge Nybegynder
08. juli 2003 - 22:14 #7
hm, prøv at indsætte cin.ignore(30,'\n') før din getline - nu har jeg ikke nærlæst din kode men det kunne godt lyde som om du har et '\n' i din buffer, hvilket terminerer din cin.getline.
Avatar billede arne_v Ekspert
08. juli 2003 - 22:19 #8
Følgende variant ser ud til at virke:

#include <cstring>
#include <iostream>
#include <fstream>

using namespace std;

void udskriv(ostream& ud, char *filnavn)
{
    char linie[128];
    ifstream read(filnavn);
 
    while (read && ! read.eof())
    {
        read.getline(linie, sizeof(linie));
        ud << linie << endl;
    }
}

int main()
{
    cout << "Hvad vil du foretage dig?" << endl;
    cout << "I)ndsætte Data i tlf listen" << endl;
    cout << "L)iste Data fra tlf listen" << endl;
    char choice[2];
    cin.getline(choice,sizeof(choice));
    if (strcmp(choice,"I")==0) {
      fstream liste("liste.txt", ios::out | ios::app);
      struct data {char navn[30]; int alder; int tlfnr;} d;
      cout << "Indtast personens navn: " << endl;
      cin.getline(d.navn, 30);
      cout << "Indtast personens alder: ";
      cin >> d.alder;
      cout << "Indtast personens tlf nr: ";
      cin >> d.tlfnr;
      liste << d.navn << " ";
      liste << d.alder << " ";
      liste << d.tlfnr << endl;
      cout << "Data er nu indsat" << endl;
      liste.close();
    }
    else
    {
        udskriv(cout,"liste.txt");
    }
    return 0;
}
Avatar billede martinbk Nybegynder
08. juli 2003 - 22:49 #9
arne_v: det virkede, lige et andet spørgsmål, så vidt jeg har læst mig frem til includerer headeren fstream automatisk iostream, hvilket vil sige #include <iostream> er overflødig, eller tager jeg helt fejl?
Avatar billede arne_v Ekspert
08. juli 2003 - 22:52 #10
Kun i nogen compilere - ikke i alle compilere - så derfor
puttede jeg den på.
Avatar billede martinbk Nybegynder
08. juli 2003 - 22:58 #11
forresten er der en nem måde at få cout til at udskrive ikke-engelske bokstaver, eller er dette en kompliceret operation ?
Avatar billede arne_v Ekspert
08. juli 2003 - 23:00 #12
cout kan sagtens udskrive ÆØÅ.

Men !

En DOS box bruger et tegn-sæt og en Windows IDE/editor et andet
tegnsæt.

Hvilket gør at ÆØÅ ikke er ens de to steder.
Avatar billede arne_v Ekspert
08. juli 2003 - 23:02 #13
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester