Archief - [PROG][C++] Hoe bestand openen en opslaan?

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.

dobber_1987

Legacy Member
Hoe kan ik in C++ een .txt bestand openen en dat bewerken en weer wegsaven? Het is de bedoeling om database'tje te maken. Hoe zit dat dan met die sql (hoe gebruiken, welke functies)? Hoe moet ik fieldseparator opgeven enzo?

|XoR|

Legacy Member
Hey,

Er zijn verschillende manieren om een file te gaan lezen of schrijven in C++, afhankelijk van welke je techniek je wil gebruiken zal je wat onderzoek moeten steken in het gebruiken ervan, wat eigenlijk doodsimpel is. De belangrijkste manieren zijn:
- STL
- MFC
- Windows API
- C style

STL (Standard Template Library)
Voordeel: Is normaal gezien platform onafhankelijk.
Nadeel: Is net iets technischer om te gebruiken.
Voorbeeld:

#include <fstream>

int main()
{
// Create a stream for writing.
ofstream TestSTL("C:\\TestSTL.txt", ios::out);
// Write some stuff.
TestSTL << "Test1\nTest2\nTest3";

// Return to caller with success.
return 0;​
}


MFC:
Voordeel: Simpel in gebruik
Nadeel: Is Visual Studio en Windows afhankelijk, MFC is ook héééél traag.
Voorbeeld:

int main()
{
CStdioFile TestMFC("C:\\TestMFC.txt", CFile::modeCreate|CFile::modeWrite);
TestMFC.WriteString("Test1\nTest2\nTest3");
TestMFC.Close();

return 0;​
}


Windows API:
Voordeel: Euh, dat je enkel met WIN 32 API werkt?
Nadeel: Is niet platform onafhankelijk, maar normaal gezien wel compiler onafhankelijk. Is ook vrij low level, dus technischer.
Voorbeeld:

#include "windows.h"
#include "tchar.h"

int main()
{
HANDLE TestWin32API = CreateFile(_T("C:\\TestWin32API.txt"), GENERIC_READ | GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (TestWin32API == INVALID_HANDLE_VALUE)
{
return -1;​
}

// Create a buffer with some text in it.
char Buffer[] = "Test1\r\nTest2\r\nTest3";
DWORD BytesWritten;

// Write the buffer.
WriteFile(TestWin32API, &Buffer, sizeof(Buffer), &BytesWritten, NULL);

// Close the file.
return CloseHandle(TestWin32API);

return 0;​
}


C Style:
Voordeel: Low level, dus normaal gezien sneller.
Nadeel: Low level, dus je zit op dieper, technischer niveau.
Voorbeeld:

#include <stdio.h>

int main()
{
// w+; Opens an empty file for both reading and writing.
// If the given file exists, its contents are destroyed.

FILE *TestCStyle;
TestCStyle = fopen("C:\\TestCStyle.txt", "w+");

// Check if file (pointer) is valid.
if (TestCStyle)
{
fprintf(TestCStyle, "Test1\nTest2\nTest3");
fclose(TestCStyle);​
}

return 0;​
}

Als je toch denkt om een database te gebruiken, zou ik me zeker niet bezighouden met zelf een DBMS te schrijven die gebruik maakt van text files. Ik zou eens tijd investeren in bv SQLite of als je full blown DB features wil, ga dan over naar een echte DB zoals bijvoorbeeld MS SQL Server of MySQL of... Op die manier zal je dus SQL kunnen gebruiken, zo niet mag je zelf een SQL parser schrijven en het wiel nog eens heruitvinden is net iets te veel van het goede...

Als je nog vragen over dit hebt, feel free to ask!

Grtz
|XoR|

S3cT0r

Legacy Member
Even een vraagje, moet er bij die STL implementatie ook nog error checking gebeuren of is dat automatisch?

Vich

Legacy Member
k3vin zei:
gaat dit ook niet gewoon met ofstream en ifstream?

Natuurlijk! fstream is een ifstream en ofstream tesamen. Als je enkel output óf input nodig hebt is het - qua design gezien - beter om een ofstream of ifstream te gebruiken. Je biedt dan de juiste interface aan, zonder extra mogelijkheden die toch niet zouden benut worden.

k3vin

Legacy Member
Vich zei:
Natuurlijk! fstream is een ifstream en ofstream tesamen. Als je enkel output óf input nodig hebt is het - qua design gezien - beter om een ofstream of ifstream te gebruiken. Je biedt dan de juiste interface aan, zonder extra mogelijkheden die toch niet zouden benut worden.

ok tnx :) ik heb nog niet zo lang C++ dusja ;)

k3vin

Legacy Member
Vich zei:
Natuurlijk! fstream is een ifstream en ofstream tesamen. Als je enkel output óf input nodig hebt is het - qua design gezien - beter om een ofstream of ifstream te gebruiken. Je biedt dan de juiste interface aan, zonder extra mogelijkheden die toch niet zouden benut worden.

ok tnx :) ik heb nog niet zo lang C++ dusja ;)

wlibaers

Legacy Member
|XoR| zei:
C Style:
Voordeel: Low level, dus normaal gezien sneller.
Nadeel: Low level, dus je zit op dieper, technischer niveau.
Voorbeeld:

Ik denk niet dat de snelheid veel zal verschillen (tenzij een van de libraries erg slecht gemaakt is), gewoon omdat het gebruik van bestanden eerder traag is omwille van de trage hardware. Het is eerder een kwestie van persoonlijke voorkeur tussen C stijl en STL.

Platformafhankelijke functies kunnen ook voordelen bieden (memory mapping bijvoorbeeld), maar als je die speciale dingen niet nodig hebt blijf je beter bij C of STL functies.

killgore

Legacy Member
wlibaers zei:
Ik denk niet dat de snelheid veel zal verschillen (tenzij een van de libraries erg slecht gemaakt is), gewoon omdat het gebruik van bestanden eerder traag is omwille van de trage hardware. Het is eerder een kwestie van persoonlijke voorkeur tussen C stijl en STL.

Platformafhankelijke functies kunnen ook voordelen bieden (memory mapping bijvoorbeeld), maar als je die speciale dingen niet nodig hebt blijf je beter bij C of STL functies.

stl klasse voor file reading is soms wat lomper geschreven voor direct access imho.

Ik heb toch eens beziggezeten voor img-reading waar het met ifstream vrij lomp was in vergelijking met de FILE-functies. Weet wel niet meer exact wat het probleem was :$.

Vich

Legacy Member
killgore zei:
stl klasse voor file reading is soms wat lomper geschreven voor direct access imho.

Ik heb toch eens beziggezeten voor img-reading waar het met ifstream vrij lomp was in vergelijking met de FILE-functies. Weet wel niet meer exact wat het probleem was :$.


Dat klopt! Alleen is STL qua programma-design dan wel overzichtelijker en veiliger(geen FILE* nodig). Dat vind ik veel belangrijker.


Als sidenote: als je dan met de unofficial 3rd party Nintendo DS compiler werkt(devkitARM) dan werkt trouwens enkel de C-style syntax :x Ik mocht recent m'n cow::FileStream implementatie herschrijven opdat die terug platform onafhankelijk werkte :x (lees: ook werkte op de Nintendo DS)
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