[c++] open("bestand") maar niet open(".bestand")

Pagina: 1
Acties:

  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05-2025

FendtVario

The leader drives Vario!

Topicstarter
Ik probeer een bestand weg te schrijven (en te lezen) en de map waar het programma actief is. Dit gaat opzich goed, totdat ik probeer een punt voor de bestandsnaam te zetten.

C++:
1
2
3
4
5
6
ofstream ini;

ini.open(".bestand", ios::in | ios::nocreate);
if !(ini.good()) {
    cout << "openen mislukt, of bestand bestaat al" << endl;
}


Als ik dit doe krijg ik een segmentation fault, maar waarom? als ik als naam "bestand" opgeef (dus zonder punt) gaat het wel goed. Rara waarom?

[ Voor 7% gewijzigd door .oisyn op 02-05-2003 10:31 ]

www.fendt.com | Nikon D7100 | PS5


  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 08-06 11:02
Ik heb niet echt veel ervaring met linux, maar is een file die begint met een punt niet hidden?
Dus eigenlijk heb je geen .bestand maar gewoon bestand die met een punt ervoor dus eigenlijk hetzelfde is als je hem opent.
Die segmentation fault vind ik alleen dan wel raar, dan zou die moeten zeggen dat die de file niet kan vinden ofzo.

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22


  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05-2025

FendtVario

The leader drives Vario!

Topicstarter
Een bestand in Linux met een punt is in zoverre hidden dat hij niet in de standaard listing voorkomt, maar alleen met ls -a, maar dat mag geen probleem zijn. Ik heb gewoon rechten om dat ding te openen. Wegschrijven met een .naam lukt ook niet (vanzelfsprekend, maar misschien ook niet).

www.fendt.com | Nikon D7100 | PS5


  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
Vreemd, ios::nocreate is bij mij onbekend, maar dit werkt prima:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <fstream>
#include <iostream>

using namespace std;

int main()
{
    ofstream ini;
    ini.open(".bestand", ios::in | ios::out);
    if ( !ini)
        cout << "Failed!\n";

    return 0;
}

ios::in | ios::out opent een bestand r/w, maar het moet wel al bestaan.

code:
1
2
3
4
5
6
7
[mh@scratchy ctst]$ ls -a
./  ../  test*  test.cc
[mh@scratchy ctst]$ ./test
Failed!
[mh@scratchy ctst]$ touch .bestand
[mh@scratchy ctst]$ ./test
[mh@scratchy ctst]$


edit:

Uit deze posting maak ik op dat iso::nocreate niet in de standaard zit. Daar staat wel hoe je het gedrag van ios::nocreate zelf kunt simuleren.

Als je wilt schrijven en lezen, waarom gebruik je dan ofstream in plaats van fstream (weet niet zeker of het uit maakt)?

Op welk statement krijg je de segv? Op de open(), of erna?

[ Voor 33% gewijzigd door _Squatt_ op 01-05-2003 22:17 ]

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


  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05-2025

FendtVario

The leader drives Vario!

Topicstarter
Wat ik probeer te lezen is een zelf gemaakte inifile, eerste lezen, aanpassen in het geheugen en dan opslaan. ios::nocreate zit volgens mij wel standaard in c++, als ik de literatuur moet geloven. Ik gebruik trouwens g++ (gcc) 2.9 onder linux.

Heb het na meerdere malen nog eens los in een appje geprobeert, nu werkt het wel, ga het straks weer proberen in het project. Vaag blijft het wel, er zitten nog een paar eigenaardig heden in het project. de segv gebeurt trouwen op de open.

www.fendt.com | Nikon D7100 | PS5


  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
FendtVario schreef op 01 May 2003 @ 22:29:
Wat ik probeer te lezen is een zelf gemaakte inifile, eerste lezen, aanpassen in het geheugen en dan opslaan. ios::nocreate zit volgens mij wel standaard in c++, als ik de literatuur moet geloven. Ik gebruik trouwens g++ (gcc) 2.9 onder linux.
Ik heb hier gcc 3.2.2, die is wat strenger ten aanzien van de standaard, dacht ik.
Heb het na meerdere malen nog eens los in een appje geprobeert, nu werkt het wel, ga het straks weer proberen in het project. Vaag blijft het wel, er zitten nog een paar eigenaardig heden in het project. de segv gebeurt trouwen op de open.
Staat in je programma ook 'ini.open(".bestand", etc' of gebruik je een variabele voor de bestandsnaam (lijkt me waarschijnlijk), misschien is die niet groot genoeg voor die extra punt?

Of door die punt er bij te zetten overschijf je aan het eind de afsluitende 0? Zeker bij een char array is dat mogelijk, en dan zou open() een bestandsnaam als ".bestand+bagger_in_geheugen_tot_de_eerstvolgende_nul" proberen te openen. Dan wordt er waarschijnlijk gelezen op een geheugenlocatie waar dat niet mag, wat je segv zou verklaren.

[ Voor 3% gewijzigd door _Squatt_ op 01-05-2003 22:40 ]

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


  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05-2025

FendtVario

The leader drives Vario!

Topicstarter
Het zit zo:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const char *SPM_DB = ".ini";

main() {
    ofstream ini;
    char *name;

    //gaat niet?? ini.open(SPM_DB, ios::in | ios::nocreate);
    strcpy(name, SPM_DB);
    cout << name << endl;
    ini.open(name, ios::in | ios::nocreate);
    if (ini.good()) {
        cout << "succesvol" << endl;
    }
}


cout geeft wel de goede naam weer, maar toch een segv. Kan iemand verklaren waarom ik SPM_DB niet in open kan mieteren?

www.fendt.com | Nikon D7100 | PS5


  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
Wat voor foutmelding krijg je bij 'ini.open( SPM_DB, etc)'? Want dat werkt hier wel.

De segv komt omdat strcpy() de inhoud van SPM_DB kopieert naar name, maar je reserveert hier geen geheugen voor. name is een 'wild pointer', 't wijst nergens specifiek heen, en naar dat nergens ga jij bytes schrijven.

Je moet eerst met new() geheugen aanvragen, of het statisch alloceren:
C++:
1
2
3
4
5
6
7
8
// statisch:
char name[10]; // ruimte voor 9 tekens + afsluitende '0'

// dynamisch:
char *name = new char[10];

// als je klaar bent met name het geheugen weer vrij geven:
delete[] name;

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


  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05-2025

FendtVario

The leader drives Vario!

Topicstarter
Whoops, ja. Nu doet ie het. Maar waarom dan geeft de cout dan toch een goed resultaat?
ik heb trouwens

C++:
1
char *name = new char;

dat blijkt ook te werken, ik moet eigenlijk de lengte van de naam lezen en dan geheugen alloceren. Mooie klus voor morgen.

www.fendt.com | Nikon D7100 | PS5


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

FendtVario schreef op 01 mei 2003 @ 22:29:
Wat ik probeer te lezen is een zelf gemaakte inifile, eerste lezen, aanpassen in het geheugen en dan opslaan. ios::nocreate zit volgens mij wel standaard in c++, als ik de literatuur moet geloven. Ik gebruik trouwens g++ (gcc) 2.9 onder linux.
Nee het valt niet onder de standaard. Als je twijfelt kun je met de online compiler van comeau proberen of een stukje code compilet. Als het onder comeau niet compilet kun je er zo goed als zeker van zijn dat het niet voldoet aan de standaard, en anders wel :)

http://www.comeaucomputing.com/tryitout/
FendtVario schreef op 02 mei 2003 @ 01:09:
Whoops, ja. Nu doet ie het. Maar waarom dan geeft de cout dan toch een goed resultaat?
ik heb trouwens

C++:
1
char *name = new char;

dat blijkt ook te werken, ik moet eigenlijk de lengte van de naam lezen en dan geheugen alloceren. Mooie klus voor morgen.
Nee dat werkt niet, dit alloceert maar 1 char!
Tip: gebruik gewoon std::string, dan heb je dat hele gezeur van memory management niet

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.


  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05-2025

FendtVario

The leader drives Vario!

Topicstarter
Ik krijg nu toch echt geen segv meer. Het werkt dus blijkbaar wel. Vanavond thuis ga ik verder hobbieen.

www.fendt.com | Nikon D7100 | PS5


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

dat je dat niet krijgt wil nog niet zeggen dat het bugvrij is.
Maar ja, je moet het zelf maar weten :X

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