[C++] Problemen met inlezen binaire bestanden onder linux

Pagina: 1
Acties:

  • codeweb
  • Registratie: Juni 2002
  • Laatst online: 10:18
Ik heb een programma geschreven dat goed draait onder windows xp, maar nu moet het ook kunn en draaien op een linux omgeving. Ok dat is allemaal leuk en aardig.

Nu ben ik wat aan het experimenteren geweest maar ik kom er toch niet helemaal uit.

Wat is het probleem
Wanneer ik een record uit een binair bestand wil inlezen word het record niet gevuld...

Mijn code
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <fstream>
using namespace std;
struct klantenstruct
{
    int nr;
    char srt[2];
    char naam[26];
    char adres[26];
    char postcode[7];
    char plaats[16];
    long banknr;
    long giro;
    char mutcode[2];
    char tariefafspraak[2];
};

int main()
{
    klantenstruct test; 
        ifstream invoer;
    invoer.open("B0100.dat", ios::binary);

    invoer.read((char *)&test, sizeof(test));
    cout << test.nr << endl;
    invoer.close();
    return 0;

}


Dat is de code die ik gebruik. Tijdens het compilen geeft hij geen errors, maar als ik hem uitvoer geeft hij de volgende output:
code:
1
1107473152


Op zich een leuk getal, maar het is niet degene die ik nodig heb; het allereerste nummer dat in het bestand staat is nummer 1, maar dat wil hij niet weergeven.

hoe kan ik ervoor zorgen dat ik toch dat record te zien krijg?

  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Heb je ergens een voorbeeld van dat binary bestand. Wellicht kan je het ergens op het web zetten. Wat krijg je te zien als je de andere gegevens naar je console output?

It’s nice to be important but it’s more important to be nice


  • codeweb
  • Registratie: Juni 2002
  • Laatst online: 10:18
heb het bestand geupload:

http://robin.solcon.nl/b0100.dat

wanneer ik het toenstraks met het veld 'naam' probeerde, kreeg ik niets te zien

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Tja, plain data structures lezen en schrijven is nou eenmaal niet platformonafhankelijk. De compiler kan zelf bepalen hoe hij de members in je structure aan elkaar plakt.

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.


  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Ik heb het onder VC++ 6 onder Windows getest en daar krijg ik als waarde -858993460 terug. Ik heb dus niet echt het idee dat het met het platform te maken heeft.
Is die binary file ook geschreven met dezelfde structure?

It’s nice to be important but it’s more important to be nice


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 20-08 00:10
Dit onderwerp maar weer eens? Misschien tijd om er een FAQ-item van te maken...

Recentelijk zijn alle voor- en nadelen van serialisatie met structs hier nog besproken:
[rml][ C++/Linux] Networking, hoe structs verzenden?[/rml]/

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik heb dus niet echt het idee dat het met het platform te maken heeft
met platform bedoel ik niet alleen het OS, maar ook de compiler, en zelfs compiler settings

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.


  • Blaasvis
  • Registratie: November 2001
  • Laatst online: 19-08 14:30

Blaasvis

Cidora \o/

code:
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
    klantenstruct test;    
        ifstream invoer;
    invoer.open("B0100.dat", ios::binary);

    invoer.read((char *)&test, sizeof test);
    cout << test.nr << endl;
    invoer.close();
    return 0;

}

Dit lijkt mij wel te werken, en vindt je het leuk op windesheim ;)

Freedom is everything you need ; <moto-moi|afk> ik verkloot het gewoon nooit :P


  • codeweb
  • Registratie: Juni 2002
  • Laatst online: 10:18
wanneer ik het dus uitvoer op een windows XP machine en krijg dit te zien:

Afbeeldingslocatie: http://robin.solcon.nl/test.jpg

  • codeweb
  • Registratie: Juni 2002
  • Laatst online: 10:18
Blaasvis schreef op 29 oktober 2003 @ 20:22:
code:
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
    klantenstruct test;    
        ifstream invoer;
    invoer.open("B0100.dat", ios::binary);

    invoer.read((char *)&test, sizeof test);
    cout << test.nr << endl;
    invoer.close();
    return 0;

}

Dit lijkt mij wel te werken, en vindt je het leuk op windesheim ;)
ja feest he :P

magoed, ik ga het eens uitproberen :)

[edit]
nee, werkt niet. Krijg weer dezelfde waarde terug

[ Voor 11% gewijzigd door codeweb op 29-10-2003 20:28 ]


  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
.oisyn schreef op 29 October 2003 @ 20:09:
[...]

met platform bedoel ik niet alleen het OS, maar ook de compiler, en zelfs compiler settings
Ik had jouw post nog niet gezien hoor toen ik dit postte. :P
Is het trouwens niet zo dat char's soms als Unicode chars kunnen worden geïnterpreteerd?

@Codeweb: Welke compiler heb je gebruikt?

It’s nice to be important but it’s more important to be nice


  • codeweb
  • Registratie: Juni 2002
  • Laatst online: 10:18
JonkieXL schreef op 29 October 2003 @ 20:27:
[...]

Ik had jouw post nog niet gezien hoor toen ik dit postte. :P
Is het trouwens niet zo dat char's soms als Unicode chars kunnen worden geïnterpreteerd?

@Codeweb: Welke compiler heb je gebruikt?
onder windows: Microsoft Visual c++ 6
onder linux: g++

[ Voor 6% gewijzigd door codeweb op 29-10-2003 20:31 ]


  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Soultaker schreef op 29 October 2003 @ 20:09:
Dit onderwerp maar weer eens? Misschien tijd om er een FAQ-item van te maken...

Recentelijk zijn alle voor- en nadelen van serialisatie met structs hier nog besproken:
[rml][ C++/Linux] Networking, hoe structs verzenden?[/rml]/
Als ik het topic zo doorlees hebben de problemen vooral met alignment van data te maken (big endian, little endian etc.).
Is dit probleem dan niet simpel op te lossen door expliciet de byte order te specificeren bij het datatype?

It’s nice to be important but it’s more important to be nice


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 21-06 17:10
ik kan me idd nog herinneren (uit de eerste van Windesheim) dat zélfs de binaire bestanden die ik met Borland C++ 5.0 gemaakt had niet gelezen konden worden door het programma wat in Visual C++ 6.0 gecompiled was!

edit:

of compile je die dan ook opnieuw onder linux?

[ Voor 15% gewijzigd door riezebosch op 29-10-2003 21:24 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 13:30

BoAC

Memento mori

.oisyn schreef op 29 October 2003 @ 20:09:
[...]

met platform bedoel ik niet alleen het OS, maar ook de compiler, en zelfs compiler settings
Geldt dit dan ook voor de functies fread en fwrite (die ik vaak voor lezen en schrijven naar bestanden gebruik?)

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 17:14
BoAC: Ja. fwrite dumpt gewoon de layout van je struct. Dat is in theorie niet eens meer bruikbaar als je je programma opnieuw opstart. In de praktijk verandert je struct layout alleen als je compileert met andere settings.

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


  • codeweb
  • Registratie: Juni 2002
  • Laatst online: 10:18
riezebosch schreef op 29 oktober 2003 @ 21:13:
edit:

of compile je die dan ook opnieuw onder linux?
We compilen hem gewoon opnieuw onder Linux.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

JonkieXL schreef op 29 oktober 2003 @ 20:27:
Is het trouwens niet zo dat char's soms als Unicode chars kunnen worden geïnterpreteerd?
Volgens de standaard zou char elk aantal bits kunnen zijn, maar gewoon op de reguliere x86 machines (windows en linux) is dat 8 bits. En een wchar_t is dan 16 bits.

Het wordt wat anders als je iets als TCHAR gebruikt, wat in principe gewoon een define is voor char of wchar_t, afhankelijk van of je de unicode compiler optie aanzet of 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.


  • codeweb
  • Registratie: Juni 2002
  • Laatst online: 10:18
ik ben achter de oplossing gekomen, heel knullig ik geef het toe, maar het bleek dat dit:
code:
1
invoer.open("B0100.dat", ios::binary);

dit moest zijn
code:
1
invoer.open("b0100.dat", ios::binary);


case-sensitive dus :X

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ja, dan lukt het inlezen niet eens. Je moet natuurlijk wel controleren op errors ;)

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