Archief - C++ tekstbestand inlezen probleem

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Dreetn

Legacy Member
Ik heb een probleem als ik mijn tekstbestand wil inlezen.
Ik moet dus een soort van digitaal telefoonboek maken.
Ik zet alle contactgegevens in een tekstbestand die ik dan later uitlees.

Zo ziet mijn tekstbestand eruit:

1. 'voornaam' 'naam' heeft telefoonnummer 'telefoonnummer' en woont te 'woonplaats'
2. 'voornaam' 'naam' heeft telefoonnummer 'telefoonnummer' en woont te 'woonplaats'

enz...
de variabelen staan tussen ' '.

Als ik dus het tekst bestand inlees verdwijnt altijd de eerste "1." ookal staat het juist in mijn tekstbestand.
Als ik de nummering verwijder dan verdwijnt de 'voornaam' van de 1e contactperzoon.

Dit is mijn code:

Code:
    ifstream invoer( "C://xxxxx/telefoonboek.txt");
         if(!invoer){
                    cerr << "Kan bestand niet openen!" <<endl<<endl<<endl<<  
                               "Het programma wordt afgesloten...";
                    Sleep (3000);
                    exit (1);
                    }          
         for (int i = 0; i < 10; i++){
         invoer >> str[i];
         while(!invoer.eof())
         {
         std::getline(invoer, str[i]);
         cout << str[i] << endl;
         }
         }

Om dit uit te testen heb ik een limiet van 10 contactpersonen gezet, niet op letten. :p


Weten jullie hoe dit komt?


Dank bij voorbaat.

Manjak

Legacy Member
Weet niet of het dit is, heb al even niet meer gecode. Maar verander
Code:
         for (int i = 0; i < 10; [B]i++[/B]){
eens naar
Code:
         for (int i = 0; i < 10; [B]++i[/B]){

edit: als dat het is dan leg ik ook even uit waarop ik me vermoeden baseer.

Parnakra

Legacy Member
Volgens mij zit je fout in je foutcontrole.

Vervang
Code:
 if(!invoer){
door
Code:
if(!invoer.is_open()){
en het zou moeten werken.

Dreetn

Legacy Member
Manjak zei:
Weet niet of het dit is, heb al even niet meer gecode. Maar verander
Code:
         for (int i = 0; i < 10; [B]i++[/B]){
eens naar
Code:
         for (int i = 0; i < 10; [B]++i[/B]){

edit: als dat het is dan leg ik ook even uit waarop ik me vermoeden baseer.
Ik versta waarom je op dit idee kwam en hoe het werkt, dit werkt ook bij java zeker?
Maar spijtig genoeg blijft mijn programma hetzelfde doen. :(

Parnakra zei:
Volgens mij zit je fout in je foutcontrole.

Vervang
Code:
 if(!invoer){
door
Code:
if(!invoer.is_open()){
en het zou moeten werken.
Onderstaand stuk code is eigenlijk enkel om te kijken of het bestan bestaat of niet. Ongeveer hetzelfde als assert() maar zonder te crashen. :p

En spijtig genoeg werkt jouw code ook niet :(

Code:
 if(!invoer){
                    cerr << "Kan bestand niet openen!" <<endl<<endl<<endl<<  
                               "Het programma wordt afgesloten...";
                    Sleep (3000);
                    exit (1);
                    }


edit: Ik heb het ondertussen gevonden "invoer >> str;" stond te veel, dat was een overblijfsel van een van mijn probeersels die ik had vergeten te verwijderen.
Toch bedankt voor jullie hulp. ;)

MAXXUR

Legacy Member
Manjak zei:
Weet niet of het dit is, heb al even niet meer gecode. Maar verander
Code:
         for (int i = 0; i < 10; [B]i++[/B]){
eens naar
Code:
         for (int i = 0; i < 10; [B]++i[/B]){

edit: als dat het is dan leg ik ook even uit waarop ik me vermoeden baseer.

Dat sloeg echt op nix man :D
Qua logica in dié statement exact hetzelfde :)

Curahee Q

Legacy Member
Veel properder zou zijn moest je het zo doen:

Code:
#include <fstream>
#include <iostream>
#include <string>
using namespace std;

void open_invoerbestand(string file, ifstream & bestand) {
	bestand.open(file.c_str());

	if(!bestand.is_open()) {
		throw "Kan bestand niet openen!";
	}
}

void sluit_invoerstroom(ifstream & bestand) {
	bestand.close();
}

int main() {
	ifstream bestand;

	try {
		open_invoerbestand("bestand.txt", bestand);

		while(!bestand.fail()) {
			// inlezen
		}

		sluit_invoerstroom(bestand);
	}
	catch(const char * s) {
		cerr << s << endl;
	}

	return 0;
}

Dreetn

Legacy Member
Danku ;)

Ik heb echter nog een probleem, het lukt mij niet om bestanden (.txt) te verwijderen, volgens mij ligt dit aan vista.

Weet iemand hoe ik dit kan oplossen?

Mvg

edit: dit is mijn code


Code:
   if (remove("C://Users/Dries/School/C++/Sessie 4/telefoonboek.txt") == -1)
            perror ("Error deleting file");
            else
            puts ("File deleted");

Parnakra

Legacy Member
Waarschijnlijk ben je je filestream(s) vergeten te closen.

Dreetn

Legacy Member
Parnakra zei:
Waarschijnlijk ben je je filestream(s) vergeten te closen.

Nee, net erboven worden mij streams gesloten:

Code:
            invoer.close();
            temp_uitvoer.close();

Cycloon

Legacy Member
Je kan ook proberen om je programma als administrator te runnen, als het dan nog niet werkt ligt het probleem zeker aan je code :)

Dreetn

Legacy Member
edit: Parnaka had gelijk ergens helemaal bovenaan had ik eentje vergeten te sluiten. ;)
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan