Toon posts:

[C++] Met ifstream lezen uit tekstbestand *

Pagina: 1
Acties:
  • 122 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik heb wat problemen met de Ifstream.
Ik wou een programma maken dat een TXT bestand inleest en deze afdrukt op het scherm. Ik heb al gezocht met google e. de GoT search maar dat levert niet op waar ik op zoek naar ben.

Ik heb dit:


bestand2.txt:
code:
1
2
3
Een, twee,
drie, vier,
vijf, zes, zeven, acht,


Programma:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <fstream>
using namespace std;

int main() 
{
    ifstream invoer( "bestand2.txt");
    string s;
    for(int i=0 ; i<3 ; i++)
    {
        getline (invoer, s);
        cout << s <<endl;
    }
    invoer.close();
}


Maar dit werkt niet omdat string geen waarde heeft. Iemand enig idee hoe ik dit kan oplossen of wat ik verkeerd doe of beter kan doen?

  • Feyd-Rautha
  • Registratie: November 2001
  • Laatst online: 02-08-2025
Heb je al gecontroleerd of het bestand "bestand2.txt" wel op de goeie plaats staat?
Wordt er daadwerkelijk een ifstream object aangemaakt, of is invoer == null ?

I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. Where the fear has gone there will be nothing. Only I will remain.


Verwijderd

Topicstarter
Ik krijg de volgende meldingen:
:\Documents and Settings\Remco\Bureaublad\ifstream\Cpp1.cpp(11) : error C2065: 'getline' : undeclared identifier
C:\Documents and Settings\Remco\Bureaublad\ifstream\Cpp1.cpp(12) : error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class std::basic_string,class std::allocator >' (or
Ik heb op het einde even RETURN 0 erbij gezet. Kreeg de melding dat er geen return value was vandaar.

[ Voor 9% gewijzigd door .oisyn op 02-10-2003 16:06 ]


Verwijderd

Moet het niet zijn:
code:
1
invoer.getline(s, ...)


http://www.cplusplus.com/ref/iostream/istream/getline.html

Verwijderd

Topicstarter
Ik heb wat geprobeert maar dat gaat niet werken :(
modbreak:
Waar slaat dat nu weer op? Als je zegt dat je wat geprobeerd hebt, zeg dan ook wat je precies geprobeerd hebt, anders is jouw reply niet echt nuttig

[ Voor 66% gewijzigd door whoami op 02-10-2003 13:45 ]


  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
Het programma werkt hier prima, weet je zeker dat het bestand in dezelfde dir staat? Probeer eens een absoluut pad op te geven naar bestand2.txt.
edit:
Het lijkt me overigens netter om ook '#include <string>' toe te voegen.

[ Voor 23% gewijzigd door _Squatt_ op 02-10-2003 13:37 ]

"He took a duck in the face at two hundred and fifty knots."


Verwijderd

Topicstarter
Ik had het bestand2.txt in dezelfde directory staan als het cpp bestand.
En wat betreft de modbreak: de verschillende manier van invoer.getline etc.

Wat ik nu heb:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main() 
{
    ifstream invoer( "bestand2.txt");
    string s;
    for(int i=0 ; i<3 ; i++)
    {
        invoer.getline (s,100);
        cout << invoer <<endl;
    }
    invoer.close();
    return 0;
}


-=edit=-
Ok doormiddel van de laatste foutmelding die ik had ben ik bij een oplossing gekomen:
http://www.cplusplus.com/doc/tutorial/tut6-1.html

Ik hoop dat ik het hier mee zal redden.

[ Voor 82% gewijzigd door Verwijderd op 02-10-2003 14:56 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21-08 18:33
De non-memberfunctie std::getline wordt gedeclareerd / gedefinieerd in <string>

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

MS VC++ 6 (en lager neem ik aan) had ook een niet volledig geimplementeerde koenig-lookup, waardoor de << operator niet werkt op strings (dat is dus die 2e foutmelding die je krijgt)

Verder, als je sowieso strings gebruikt, is het goed om string apart te includen. Je hebt namelijk niet de garantie dat die in iostream oid staat (wat je code dus ook gelijk nonportable maakt)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Dit is het resultaat:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <fstream>
using namespace std;

int main ()
{
    char buffer[256];
    ifstream bestand ("bestand2.txt");

    while (!bestand.eof() )
        {
            bestand.getline (buffer, 100);
            cout << buffer << endl;
        }
  return 0;
}


Nu moet ik nog voor mekaar zien te krijgen dat ik het per regel in lees.

[ Voor 22% gewijzigd door Verwijderd op 02-10-2003 17:02 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Waarom ben je ineens overgegaan op de .h varianten? En nu gebruik je alsnog istream::getline (). Wat is er mis met de global getline ()?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Ik heb dingen zitten combineren en wegwerken fouten.
Die bestand.getline is nog steeds zelfde had invoer.getline

Ok als je hem zo wilt zien mag ook, wat orde in de chaos gemaakt.

[ Voor 24% gewijzigd door Verwijderd op 02-10-2003 17:01 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nee, eerst maakte je gebruik van de global getline (die beter is, want die leest gewoon altijd 1 regel in, en voorkomt buffer overruns)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Maarjah dat is het probleem de global getline deed het bij niet.
Dus na wat zoeken vond ik waarschijnelijk de oplossing en die geprobeert en jah dat werkte.

Maar als het beter kan graag maar je moet wel begrijpen dat ik nog lang niet zo goed in C++ ben als jij en menig andere personen hier.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

De oplossing staat anders in deze draad, je schijnt er alleen weinig mee te doen. En het is natuurlijk ook gewoon een kwestie van de documentatie lezen

hint: [rml]farlane in "[ C++] Met ifstream lezen uit tekstbestan"[/rml]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Met de hulp van een mede student die kwam met een aanpassing voor de buffer.
Dit bedoel jij waarschijnelijk als ik zo lees en probeer te snappen :)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
using namespace std;

int main ()
{
    string buffer;
    ifstream bestand ("bestand2.txt");

    while (!bestand.eof() )
        {
            std::getline(bestand, buffer);
            cout << buffer << endl;
        }
  return 0;
}

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

choeso jei :Y)

en wat was nou het probleem? Je was de <string> header vergeten te includen, zoals farlane al aangaf. En dat kon je zelf natuurlijk ook wel makkelijk bedenken door even de documentatie van de getline () functie te bestuderen :)

[ Voor 90% gewijzigd door .oisyn op 02-10-2003 17:23 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
jep daar heb je gelijk in maarja het is ook niet zo makkelijk :)
Nu nog zorgen dat ik kan bepalen hoe ik alleen regel1 uit bestand kan halen etc.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21-08 18:33
Toch is 'ie nog niet helemaal correct; eof checken is goed maar er kunnen waarschijnlijk nog wel meer fouttoestanden optreden.

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
    ifstream file("c:/AUTOEXEC.BAT",std::ios_base::in );
    
    string line;
    while( getline( file, line ) )
    {
        /* do something with line here */
        std::cout<<line<<"\n";
    }

    std::cin.get();
    return 0;
}


getline returned een basic_istream, die op zijn beurt wordt gecast naar een bool dmv
C++:
1
basic_ios::operator void *

Deze operator returned
C++:
1
rdstate() & failbit


Maw, zolang de stream goed blijft ( o.a als geen eof() ) , wordt bool( getline( ... ) ) true.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
eof() checken is niet goed, want dat wordt pas achteraf gezet - nadat een leesactie mislukt is. In farlane's versie wordt een getline() die op eof faalt niet gebruikt, goed. In de TS zijn versie wordt die getline() meteen naar std::cout gestuurd. De laatste regel wordt dan dus dubbel geprint, omdat getline() de laatste keer buffer niet overschrijft.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • neevedr
  • Registratie: November 2002
  • Laatst online: 07:47

neevedr

Dat was ik niet!

Moet dat niet "c:\\AUTOEXEC.BAT" zijn?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Kan allebei, maar ik weet eigenlijk niet wat de officiele standaard daarvoor is. MSalters?

Maar ja, filesystems zijn sowieso niet echt portable, dus ik vraag me af in hoeverre dat uitmaakt :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21-08 18:33
Normaal gesproken wordt de forward slash geaccepteerd op meerdere platforms, maar daar is niet echt een pijl op te trekken volgens mij.

Iig is het leesbaarder dan die geescapede backslash. :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
De enige officiele standaard is POSIX, dus "/autoexec.bat" etcetera. :)

C++ zegt bijna niks over filesystemen; de string gaat recht naar het OS. Het enige wat er gegarandeerd is dat als je een filesysteem hebt, dat je dan een file kunt maken met een naam van 6 lowercase letters en dat je die file vervolgens weer terug kunt lezen - mits je het programma natuurlijk niet exit, RAM disks zijn volledig legaal.

De nieuwe standaard krijgt misschien de filesystem library uit Boost, als de ervaringen daarmee positief zijn

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
C++ FAQ 15.16, redenen om altijd '/' te gebruiken in plaats van '\\'.

"He took a duck in the face at two hundred and fifty knots."


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

als je \\ gebruikt dan is er juist geen probleem. Het is pas een probleem als je \ gebruikt ;)
Het is overigens gewoon een kwestie van ervaring. Ik heb mezelf die fout iig nog nooit zien maken... Voor portable code gebruik ik overigens wel de /

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1