Avatar billede simonsen2 Nybegynder
13. december 2003 - 12:58 Der er 9 kommentarer og
1 løsning

indlæsning fra tekstfil

Når jeg indlæser data fra min tekst fil, skippes det første tal i nummeret, hvordan løses dette?

I min tekst fil er følgende data:
1200        mel      kg.       
7845        gryn      kg.

når jeg skriver det ud til skærmen står der:
200 mel kg.       
845 gryn kg.

Min kode ser således ud:

ifstream indFil;
        indFil.open("vareListe.txt");

        if(indFil.fail())
        {
                cout << "Filen vareListe.txt kan ikke åbnes";
                getch();
                exit(1);
        }

        int nummer;
        string navn;
        string enhed;

        char next;
        while(indFil >> next)
        {
                indFil >> nummer >> navn >> enhed;
                cout << nummer << "  "  << navn  << "  " << enhed << endl;
       
        }
        indFil.close();
Avatar billede driis Nybegynder
13. december 2003 - 13:39 #1
Hvor kommer tekstfilen fra ? ifstream læser jo filen som ascii tekst, og det er muligt, at der på sidste plads i hver linje står en kontrolkarakter, der får ifstream til at springe næste karakter over.
Avatar billede akempff Nybegynder
13. december 2003 - 13:52 #2
Du henter den første karakter ind i din next char i dit guard. "indFil >> next"
Så der ligger din manglende 1-karakter.

Du kan bruge next = indFil.peek(); istedet, den fjerner ikke karakteren fra streamen og returnerer værdien eller EOF hvis der ikke er noget.
Avatar billede simonsen2 Nybegynder
13. december 2003 - 14:21 #3
Filen danner jeg ved ofstream udFil og skriver i en forlykke
udFil << liste[i].getNummer();
udFil << liste[i].getNavn();
udFil << liste[i].getEnhed() << endl;

hvordan kan jeg bruge next = indFil.peek(); ?

char next;
next = indFil.peek();
while(indFil >> next)

Jeg har prøvet dette det løser ikke problemet.
Avatar billede akempff Nybegynder
13. december 2003 - 14:29 #4
Nej for så læser du jo den jo bare ind igen.
Når du laver indFil >> next, så fjerner du karakteren fra din stream og lægger den i din next char. Hvis du skal gøre det sådan der, så skal du jo sammensætte dit nummer af din next og din nummer variabel, men det bliver lidt noget rod.

Prøv at ændre dit while guard til while(indFil.peek() != EOF)
Avatar billede simonsen2 Nybegynder
13. december 2003 - 14:34 #5
Tusind tak - det har reddet min dag,
Nu virker det bare.....
Avatar billede simonsen2 Nybegynder
13. december 2003 - 14:38 #6
Ja, okay - jeg blev lige begejstret
nu skrives den sidste linie ud 2 gange. Måske skal jeg oprette spørgsmålet igen?
1200        mel      kg.       
7845        gryn      kg.
7845        gryn      kg.
Avatar billede arne_v Ekspert
13. december 2003 - 14:57 #7
Check lige om du har en blank linie forneden i filen.
Avatar billede simonsen2 Nybegynder
13. december 2003 - 16:36 #8
Ja, jeg har en blank linie forneden i filen.
Jeg er startet med while(!indFil.eof()), men der kopierede den også sidste linje, derfor forsøgte jeg mig med
char next;
next = indFil.peek();
while(indFil >> next)

Er endl ikke det samme som "\n" i forhold til ny linje?
udFil << liste[i].getEnhed() << endl;
Avatar billede arne_v Ekspert
13. december 2003 - 16:40 #9
Jo.

Overvej at bruge indFile.getline til at læse linier med og parse dem
manuelt - det giver lidt bedre kontrol over input.
Avatar billede simonsen2 Nybegynder
13. december 2003 - 16:48 #10
Jeg fik løst problemet ved at skrive:
while(!indFil.eof())
        {
                indFil >> nummer >> navn >> enhed;
                if(!indFil.eof())
                {
                        cout << nummer << navn << enhed << endl;
                }
        }

Jeg ved ikke om det er en smart løsning, men det virker.
Tak for hjælpen!!
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