2010-08-21 15 views
0

J'ai un tableau d'une grande structure que j'essaie de sortir sur le disque dur. J'ai l'impression d'être capable d'écrire sur le disque dur (bien qu'il soit difficile de le vérifier en regardant les données binaires), mais quand je tente de le relire, je me retrouve toujours avec un désordre brouillé. Des idées de ce que je fais mal?Sortie de grandes structures en HD

est ici la configuration de la structure:

class xyz 
{ 
public: 
    double x, y, z; 
}; 
class trianglePackage 
{ 
public: 

    int score; 
    int position; 

    xyz contactCoordinates; 
    xyz normalVector; 
    xyz locatorOffset; 

}; 
class quadanglesOutput 
{ 
public: 

    int locator1position, locator2position, locator3position, locator4position; 

    xyz centroid; 

    int surfaceAreaScore; 
    int centroidDifferance1Score; 
    int centroidDifferance2Score; 
    int minDistance1Score; 
    int minDistance2Score; 

    int totalLocatorScore; 
    int totalHullScore; 
    int totalScore; 

    double surfaceArea; 
    double centroidDifferance1; 
    double centroidDifferance2; 
    double minDistance1; 
    double minDistance2; 

    int hull; 

    trianglePackage locator1, locator2, locator3, locator4; 
}; 

et voici les lecture/fonctions d'écriture que je utilise:

void outputQuadangleOutput(quadanglesOutput* output, string description, param parameters) 
{ 

    string outputName = parameters.fileName + " " + description + ".bin"; 
    cout << "Output " << outputName.c_str() << "..."; 
    ofstream output2; 
    output2.open(outputName.c_str()); 
    output2.write(reinterpret_cast<char*>(output), streamsize(parameters.topXlist * sizeof(quadanglesOutput))); 
    output2.close(); 
    cout << "done" << endl; 

} 
void readIn(quadanglesOutput* pointer, param parameters, string description) 
{ 
    string fileName = parameters.fileName + " " + description + ".bin"; 
    cout << "openining " << fileName << "..."; 
    ifstream readFile; 
    readFile.open(fileName.c_str()); 
    readFile.read(reinterpret_cast<char*>(pointer), (parameters.topXlist * sizeof(quadanglesOutput))); 
    readFile.close(); 
    cout << "done" << endl; 
} 

En général, les tableaux de structures sont environ 100 en longueur, mais en général seulement à propos des 25 premières lectures correctement, tout le reste est des données non initialisées par défaut.

Je suis sûr à 99% que quelque chose ne va pas avec mon code, mais est-il possible qu'il ait quelque chose à voir avec un alignement de quatre octets?

Merci.

Répondre

1

Il peut s'agir d'un problème avec l'alignement des octets, utilisez pragma. cours d'emballage essayer autour avec

#PRAGMA PACK PUSH(1) 
.... 
#PRAGMA PACK POP 

ou

#PRAGMA PACK(1) 
struct{ 
.. 
} 

Essayez les ainsi:
Force de drapeau binaire pour le flux.

ios_base :: binaire

readFile.open(fileName.c_str(), ios_base::binary); 

Essayez de vider le flux.

stream.write(...) 
stream.flush() 

// Je sais que close() devrait le vider.

MISE À JOUR:
Tout fonctionne pour moi:

#include <iostream> 
#include <fstream> 
#include <string> 
#include <stdlib.h> 

using namespace std; 
#pragma pack(1) 
class xyz 
{ 
public: 
    double x, y, z; 
}; 

#pragma pack(1) 
class trianglePackage 
{ 
public: 

    int score; 
    int position; 

    xyz contactCoordinates; 
    xyz normalVector; 
    xyz locatorOffset; 

}; 

#pragma pack(1) 
class quadanglesOutput 
{ 
public: 

    int locator1position, locator2position, locator3position, locator4position; 

    xyz centroid; 

    int surfaceAreaScore; 
    int centroidDifferance1Score; 
    int centroidDifferance2Score; 
    int minDistance1Score; 
    int minDistance2Score; 

    int totalLocatorScore; 
    int totalHullScore; 
    int totalScore; 

    double surfaceArea; 
    double centroidDifferance1; 
    double centroidDifferance2; 
    double minDistance1; 
    double minDistance2; 

    int hull; 

    trianglePackage locator1, locator2, locator3, locator4; 
}; 

class param 
{ 
public: 
    string fileName; 
    int topXlist; 
}; 


void outputQuadangleOutput(quadanglesOutput* output, string description, param parameters) 
{ 

    string outputName = parameters.fileName + " " + description + ".bin"; 
    cout << "Output " << outputName.c_str() << "..."; 
    ofstream output2; 
    output2.open(outputName.c_str()); 
    output2.write(reinterpret_cast<char*>(output), streamsize(parameters.topXlist * sizeof(quadanglesOutput))); 
    output2.close(); 
    cout << "done" << endl; 

} 
void readIn(quadanglesOutput* pointer, param parameters, string description) 
{ 
    string fileName = parameters.fileName + " " + description + ".bin"; 
    cout << "openining " << fileName << "..."; 
    ifstream readFile; 
    readFile.open(fileName.c_str()); 
    readFile.read(reinterpret_cast<char*>(pointer), (parameters.topXlist * sizeof(quadanglesOutput))); 
    readFile.close(); 
    cout << "done" << endl; 
} 



int main(int argc, char *argv[]) 
{ 

    quadanglesOutput a = {0}; 
    cout<<"total score:"<<a.totalScore<<endl; 
    cout<<"locator position:"<<a.totalScore<<endl; 
    cout<<"locator position:"<<a.locator1.position<<endl; 
    cout<<"locator position:"<<a.locator2.normalVector.y <<endl; 
    cout<<"sizeof quadangsomething:"<<sizeof(quadanglesOutput)<<endl; 
    a.totalScore=1; 
    a.locator1.position=333445; 
    a.locator2.normalVector.y = 999.3224; 
    cout<<"total score:"<<a.totalScore<<endl; 
    cout<<"locator position:"<<a.locator1.position<<endl; 
    cout<<"locator position:"<<a.locator2.normalVector.y <<endl; 
    param p = {"C:/", 1}; 
    outputQuadangleOutput(&a, "file1", p); 

    quadanglesOutput *b = new quadanglesOutput(); 
    readIn(b, p, "file1"); 
    cout<<"new total score:"<<b->totalScore<<endl; 
    cout<<"new locator position:"<<b->locator1.position<<endl; 
    cout<<"new locator position:"<<b->locator2.normalVector.y <<endl; 

    delete b; 





    string asdf; 
    cin>>asdf; 

}; 

SORTIE:
score total: 0
locator: 0
locator2.normalVector.y: 0
sizeof quadangsomething: 436
score total: 1
position de localisation: 333445
locator2.normalVector.y: 999,322
sortie C:/... file1.bin fait
openining C:/... file1.bin fait
nouveau score total: 1
nouveau position du localisateur: 333445
new locator2.normalVector.y: 999.322

sans pragma il est toujours correct, mais vous pouvez voir la différence de taille:

sizeof quadangsomething: 440

Mais emballaient il est bon lors de l'envoi des structures sur le réseau.
Parce que ici le système l'allie toujours de la même manière.

+0

Hmm, ça fait toujours la même chose qu'avant. Les 25 premières entrées sont bonnes, le reste est brouillé. – Faken

+0

Le drapeau binaire semble avoir même réduit le nombre de valeurs correctement lues, maintenant il ne lit que les 10 premiers éléments avant de produire une sortie apparemment aléatoire (par opposition à la sortie précédente "CD" dans le code hex encore et encore). – Faken

+1

@faken: Avez-vous utilisé le mode binaire pour l'entrée et la sortie? –