Utilisation de fstream : Ecrire dans un fichier binaire [Résolu]

Signaler
Messages postés
256
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
30 mai 2016
-
Messages postés
256
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
30 mai 2016
-
Bonjour,

Je voudrais écrire dans un fichier binaire avec fstream.
Actuellement j'y arrive pour les données devant apparaitre en clair, mais la taille par exemple qui ne doit pas apparaitre en clair, ben j'arrive pas à ce que se soit pas en clair quoi.

Si cela peut aider, voici le code de ma classe :
#include <fstream>
#include "tst.h"

TSTFile::TSTFile()
{
    m_stream = new fstream;
}

TSTFile::~TSTFile()
{
    delete m_stream;
}

/*Ouvre l'archive en lecture ou écriture suivant ce qui est demandé*/
bool TSTFile::open(string fileName, bool Write)
{
    if (Write)
    {
        m_stream->open(fileName.c_str(), ios::out | ios::ate | ios::binary);
        m_stream->clear();
        m_stream->write("TST", 3);
    }
   
    else
    {
        m_stream->open(fileName.c_str(), ios::in | ios::ate | ios::binary);
        m_stream->clear();
    }
   
    if ( m_stream->fail() )
    {
        return false;
    }
   
    else
    {
        return true;
    }
}

/*Enregistre dans l'archive le fichier source*/
bool TSTFile::write(string source)
{
    ifstream sourceStream(source.c_str(), ios::in | ios::binary);
    char buffer[1] = {0};
    char name[9] = {0};
    sprintf(name, "%d", source.length());
   
    sourceStream.clear();
    m_stream->write(name, 4);
    m_stream->write( source.c_str(), source.length() );
   
    while (!sourceStream.eof())
    {
        sourceStream.read(buffer, 1);
        m_stream->write(buffer, 1);
    }
   
    sourceStream.close();
    return true;
}

void TSTFile::close()
{
    m_stream->close();
}

ca c'était tst.cpp, voici tst.h :
#ifndef H_TST
#define H_TST

#include <fstream>
#include

using namespace std;

class TSTFile
{
    private:
    fstream *m_stream;
   
    public:
    TSTFile();
    ~TSTFile();
    bool open(string fileName, bool Write); //Ouverture de l'archive
    bool write(string source); //Enregistrement d'un fichier dans l'archive
    void close(); //Ferme les flux
};

#endif

et enfin le main.cpp :
#include
#include "tst.h"

using namespace std;

int main (int argc, char *argv[])
{
    TSTFile tst;
   
    if (argc == 4)
    {
        if ( (strcmp(argv[1], "-w") == 0)  || (strcmp(argv[1], "--write") == 0) )
        {
            cout << "Enregistrement en cours du fichier " << argv[3] << " dans l'archive " << argv[2] << endl;
           
            if ( tst.open(argv[2], true) )
            {
                if ( tst.write(argv[3]) )
                {
                    tst.close();
                }
               
                else
                {
                    cout << "impossible d'enregistrer le fichier" << endl;
                }
            }
           
            else
            {
                cout << "Impossible d'ouvrir l'archive" << endl;
            }
        }
    }
   
    return EXIT_SUCCESS;
}

Merci d'avance à ceux qui pourront m'aider.

3 réponses

Messages postés
1107
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
4
Euh ... Que veux-tu faire ?
Avec :
sprintf(name, "%d", source.length());
m_stream->write(name, 4);
C'est clair que tes 4 premiers octets sont une string, donc la taille en clair.

Tu stockes la taille tu nom du fichier en premier, c'est ca que tu ne veux pas mettre en clair ?
Je connais mal les STL mais
int sourceLen = source.length();
m_stream->write((char *)&sourceLen, 4); ca ne marche pas ?
Messages postés
256
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
30 mai 2016
4
J'ai essayé comme ça mais j'ai une erreur de segmentation c'est ça que je comprend pas.

Oui, je souhaite stocké mais pas en clair, la taille du nom du fichier, je veux faire pareil pour la taille du fichier.

Je souhaite en fait faire un jeu (MMORPG, vous moquez pas, j'ai la motivation et je prépare le terrain longtemp à l'avance), et donc avant de me lancer je souhaite apprendre plusieurs trucs don concevoir un format de fichier d'archive pour le jeu avec donc certaines infos qui ne sont pas en clair comme les tailles ;)
Messages postés
256
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
30 mai 2016
4
Bon ben je comprend plus, j'ai retenté de passer du size_t au int et ca fonctionne.
je sais pas ce qui lui avait pris, problème réglé.