File I/O

Status
Niet open voor verdere reacties.

Arjan B

Gebruiker
Lid geworden
11 dec 2006
Berichten
364
Ik moet voor een schoolopdracht een systeem maken dat de tijd dat een werknemer werkt registreert. Nu wil ik die tijden in een bestand opslaan maar hij doet niet wat ik wil ^^.

Code:
#include <iostream>
#include <fstream>
#include <list>
#include <string>

struct entry {
	char name[25];
	double hours;
};

std::list<entry> readDatabase();
void writeDatabase(std::list<entry> list);

int main() {
	std::cout << "Reading in database..." << std::endl;
	std::list<entry> list = readDatabase();

	std::cout << "In database:" << std::endl;
	for (std::list<entry>::const_iterator i = list.begin(); i != list.end(); ++i) {
		std::cout << (*i).name << ": " << (*i).hours << std::endl;
	}

	std::cout << "Writing to database..." << std::endl;
	writeDatabase(list);
	
	std::cout << "Done." << std::endl;
	std::cin.get();

	return 0;
}

std::list<entry> readDatabase() {
	std::ifstream database("database.dbf", std::ios::binary);
	std::list<entry> list;
	
	if (database) {
		while (!database.eof()) {
			entry e;
			database.read(reinterpret_cast<char*>(&e), sizeof(e));
			list.push_back(e);
		}
	}

	return list;
}

void writeDatabase(std::list<entry> list) {
	std::ofstream database("database.dbf", std::ios::binary | std::ios::trunc);

	for (std::list<entry>::iterator i = list.begin(); i != list.end(); ++i) {
		database.write(reinterpret_cast<char*>(&(*i)), sizeof(*i));
	}
}

Iedere keer dat ik deze code uitvoer voegt hij de laatste in de lijst nóg een keer toe.

Dus als het eerst was:
Arjan Broos: 80
Luuk van Wezel: 80
Piet Puk: 40

Dan word het daarna:
Arjan Broos: 80
Luuk van Wezel: 80
Piet Puk: 40
Piet Puk: 40

Ik kan alleen niet vinden waar ik dan die laatste dubbel inlees of wegschrijf..

Als iemand dit wel kan vinden ^^?

Alvast bedankt!
 
Met dank aan ÜBERGURU van e-programmeur:

Code:
std::list<entry> readDatabase() {
    std::ifstream database("database.dbf", std::ios::binary);
    std::list<entry> list;
    
    if (database) {
        bool reading = true;
        while (reading) {
            entry e;
            database.read(reinterpret_cast<char*>(&e), sizeof(e));
            if (!database.eof())
                list.push_back(e);
            else
                reading = false;
        }
    }

    return list;
}

database.eof() geeft pas true terug als je OVER het einde van de file heenleest.
 
Laatst bewerkt:
Code:
std::list<entry> readDatabase() {
	std::ifstream database("database.dbf", std::ios::binary);
	std::list<entry> list;
	
	if (database) {
		while (!database.eof()) {
			entry e;
			database.read(reinterpret_cast<char*>(&e), sizeof(e));
			list.push_back(e);
		}
	}
        list.pop_back(); 
	return list;
}

Bovenstaande zou als het goed is ook moeten werken. Ziet misschien wat netter uit.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan