Utilisation de fstream : Ecrire dans un fichier binaire

Résolu
cs_christophedlr Messages postés 267 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 23 août 2023 - 16 avril 2009 à 23:11
cs_christophedlr Messages postés 267 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 23 août 2023 - 18 avril 2009 à 11:59
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

fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
17 avril 2009 à 08:14
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 ?
3
cs_christophedlr Messages postés 267 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 23 août 2023 5
17 avril 2009 à 10:28
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 ;)
0
cs_christophedlr Messages postés 267 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 23 août 2023 5
18 avril 2009 à 11:59
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é.
0
Rejoignez-nous