2015-11-04 1 views
1

J'ai lu beaucoup de choses à propos de ne pas utiliser C-style en C++, mais plutôt utiliser des conteneurs comme std :: array, std :: vector ou std :: string.std :: array et bytes lecture

Maintenant, j'essaie de lire et d'écrire de petits fichiers binaires avec des flux de fichiers et de les stocker dans std :: array.

Il ressemble à la méthode de lecture et d'écriture de std :: fstream ne peut fonctionner qu'avec des tableaux de style C ...

donc ce que je pense:

int main(int argc, char **argv) 
{ 
    std::fstream testFile, outTestFile; 
    testFile.open("D:/mc_svr/another/t/world/region/r.0.0.mca", std::fstream::in | std::fstream::binary); 
    outTestFile.open("D:/mc_svr/another/t/world/region/xyz.xyz", std::fstream::out | std::fstream::binary); 

    std::array<byte_t, 8192> testArray; 

    testFile.read((char*) &testArray, 8192); 
    outTestFile.write((char*) &testArray, 8192); 

    testFile.close(); 
    outTestFile.close(); 

    return 0; 
} 

byte_t est juste a

typedef char byte_t; 

Cela fonctionne. Mais c'est la bonne façon de le faire? Si non, quelles sont les autres façons de le faire? Dois-je utiliser byte_t [] à la place?

+1

Ce code que vous montrez définitivement ne fonctionne pas, du moins pas comme vous le souhaitez. Quand vous faites par exemple 'outTestFile.write ((char *) & testArray, 8192);' vous écrivez l'objet 'testArray' * * et non le tableau réel que' testArray' encapsule. Et les fonctions de lecture et d'écriture peuvent lire et écrire des données arbitraires, il ne doit pas nécessairement s'agir de tableaux de type C (comme vous le voyez dans votre code défectueux). Par exemple, pour écrire une seule valeur entière, vous pouvez le faire par ex. 'outTestFile.write (reinterpret_cast (& intVariable))' –

+0

Eh bien, sur ma machine fonctionne bien, mais c'est pourquoi j'ai demandé: pour être sûr. Merci pour votre réponse. EDIT: Oui, je sais lire et écrire d'autres types de données binaires (la plupart des nombres). –

+0

@JoachimPileborg puisque std :: array n'a probablement aucun autre membre sauf data, le programme fonctionnera comme prévu. Bien que ce soit une mauvaise idée de le faire en général. –

Répondre

5

Utilisation std::array::data:

testFile.read(testArray.data(), testArray.size()); 
outTestFile.write(testArray.data(), testArray.size()); 

Notez l'utilisation de .size() au lieu du nombre magique.

Aussi vous n'avez pas besoin de .close() vos fichiers. Le destructeur fstream le fera pour vous.

+0

Merci beaucoup. Je pense parfois que j'ai vraiment besoin d'utiliser des nombres, surtout quand je n'écris pas tout le tableau. Je vais garder à l'esprit le destructeur de fstream faire tout mon travail pour moi. Merci ! –