IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Déclarer un stringstream et binary data


Sujet :

Langage C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut Déclarer un stringstream et binary data
    Bonjour,

    Comment déclarer un stringstream ? J'ai essaye toutes les possibilités et à la compilation j'ai une erreur :

    std::stringstream ssdata(std::stringstream::out | std::stringstream::binary);
    
    Erreur	3	error C2061: erreur de syntaxe*: identificateur 'out'
    j'ai déclaré les entêtes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <stream>
    #include <iostream>
    j'ai essayé ios::binary, j'ai mis aussi en haut using namespace std;, j'ai toujours cette erreur.

    j'utilise Visual Studio 2010, sur Windows x64.

    Avez vous une idée ?

    Merci de votre aide.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut
    J'ai même essayé tout les entêtes inimaginable avec le mot stream, ça ne marche pas.

    quelqu'un a déjà utilisé les stringstream ?

    Y a t-il une directive de compilation a cocher ?

    Edit:cette variable est déclarée dans une classe au niveau private.

  3. #3
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Citation Envoyé par andromeda Voir le message
    J'ai meme essaye tout les entetes inimaginable avec le mot stream, ca ne marche pas.

    <sstream> aussi ?

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut
    lol, oui aussi , c'est la première chose que j'ai fait.

    Je ne voit pas d'où viens le problème.


    J'ai meme essayer de mettre dans le source
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #ifdef __cplusplus
    extern "C" {
    #endif
    au début, pour voir si ça venait de ça, mais rien.

    en fait le stream est reconnu mais c'est le paramètre std::stringstream::out qui donne l'erreur, j'ai tenté ios::out, tout les paramètre de la doc sur les stream et ça ne marche pas.

    Quelqu'un pourrais m'aider .

    Merci pour votre aide.

  5. #5
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,

    La programmation ce n'est pas écrire n'importe quoi et bidouiller jusqu'à ce que ça marche.

    Si on regarde les constructeurs de stringstream, on voit qu'il prend un std::ios_base::openmode.

    Ce code compile donc parfaitement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <sstream>
     
    int main(void)
    {
     
            std::stringstream( std::ios_base::binary | std::ios_base::out);
            return 0;
    }

  6. #6
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Je ne sais si c'est le compilateur qui donne des erreurs plus qu'étrange ou si ça vient de moi mais c'est syntaxiquement valide. Et ça compile très bien chez moi.
    Du coup, compiles-tu bien en C++ ?

  7. #7
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Mea culpa, cela compile aussi avec ios:: et stringstream::.

    Tu peux nous montrer exactement le code que tu compiles ?

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut
    Avec le code que tu as mis ça ne fonctionne pas non plus

    Erreur 11 error C2061: erreur de syntaxe*: identificateur 'binary'
    c'est juste une declaration de variable dans une class:

    J'ai même ajoute #include <iostream> et ce ne compile pas, j'utilise visual studio en C++

    Cette variable est déclaré dans un include dans la partie private de la classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    #ifndef __CSOCK_H__
    #define __CSOCK_H__
     
    #include <vector>
    #include <string>
    #include <sstream>
    #include <iostream>
    #include <assert.h>
     
    #include "ECSock.h"
     
     
    #ifdef LINUX
    	#include <sys/types.h>
    	#include <sys/socket.h>
    	#include <sys/ioctl.h>
    	#include <netinet/in.h>
    	#include <arpa/inet.h>
    	#include <netdb.h>
    	#include <errno.h>
    	#include <stdio.h>
    	#include <iostream>
     
    	#define SOCKET_ERROR -1
    	#define INVALID_SOCKET -1
     
    	typedef unsigned short WORD;
    	typedef int SOCKET;
    	typedef struct sockaddr_in SOCKADDR_IN;
    	typedef struct hostent* LPHOSTENT;
    	typedef struct servent* LPSERVENT;
    	typedef struct in_addr* LPIN_ADDR;
    	typedef struct sockaddr* LPSOCKADDR;
    #else
    	#include <winsock2.h>	
    	#include <ws2tcpip.h>	
    	#include <Windows.h>
    	#include <tchar.h>
    	#include <stdlib.h>
    	#include <stdio.h>
    	#include <ctype.h>	
    	#include <time.h>	
    	#include "CSockCli.h"	
    	#pragma comment(lib, "ws2_32.lib")
    #endif
     
     
     
    #define TIME_IN_SEC		5		// how long client will wait for server response in non-blocking mode
    #define BUFFER_SIZE		153600 //81920 //10240	  // SendData and RecvData buffers sizes
     
    class CSock  
    {	
    public:
    	enum CSockProtocol
    	{
    		HTTP10 = 0,
    		HTTP11 = 1
    	};
     
    	CSock();	
    	~CSock();
    	void AddHeader(const char *header);
    	const char* GetLocalHostIP() const;
    	const char* GetLocalHostName() const;
    	void Send();
    	void SendLine(const char* line);
    	void SetRemoteServer(const char* pHost,const unsigned short port=0);
    	void SetFilename(const char* filename);
    	const char* GetFilename() const;
     
    	void Binary();
    	void Ascii();
     
    	char* GetRcvData();
    	long GetDataLen();	
    	void ClearHeaderData(void);
     
    	void SetProtocolVersion(CSockProtocol protocol);
    	void SetUrl(const char* url);
    	void SetTimeout(long timeout);
     
    	SOCKET TCPConnect(const char * pHost, const unsigned short nPort_=23);		
    	long   TCPReadLine();
     
    	void HTTPGet(const char * url);		
    	void HTTPGetToFile(const char * filename, const char* url);	 	
    	void HTTPGetToStream(const char* filename, const char* url, const char* pHost, const unsigned short port);	 
    	int	 HTTPGetHeaderInfo(std::string key, std::string& value);
    	void WriteDataToFile();
    	void WriteRawDataHTMLToFile();
     
    	unsigned short GetPort(void);
    	const char * GetHost() const;
    	int GetLastStatusCode(void);
     
    private:		
    	std::string m_sLocalHostName;	
    	std::string m_sUrl;
    	std::string m_sHost;	
    	std::stringstream( std::ios_base::binary | std::ios_base::out);
     
    	int m_nHTTPLastStatusCode;
    	unsigned short m_iRemoteSrvPort;
    	std::string m_sProtocolVersion;
    	long m_nRcvBufLen;
    	long m_nTimeout;
     
    	char *SendBuf;
    	char *RecvBuf;
     
    	bool m_bBinary;
    	bool m_bAscii;
     
    	SOCKET hSocket, hSocketSrv;
     
    	std::string m_sFileName;
    	std::string m_sPathName;
     
    	std::vector<std::string> HeaderData;
     
    	DWORD  m_uiID;	
        HANDLE m_ulHandle;
    	HWND m_hWnd;
     
    	long ReceiveDataAscii();
    	long ReceiveDataBinary();	
    	long ReceiveDataLine();
    	long ReceiveDataLine(SOCKET s);
    	void CleanBuffer(char * buffer);
    	void SendData();
    	void SendData(SOCKET& s);
     
    	int  FileExists(const char *filename);	
    	std::string GetPathFromFilename( const char* filename );	
    	int HtmlXYZdigits();
    	SOCKET ConnectRemoteServer(const char* server, const unsigned short port=0);
    	void HTTPFormatHeader(char* header);
    	void HTTPGet(const char* url, const char* pHost, const unsigned short port=80);
    	void HTTPGetToFile(const char* filename, const char* url, const char* pHost, const unsigned short port=80);	
     
    };
     
     
    #endif

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut
    J'ai aussi cette erreur:

    Erreur	2	error C2838: 'binary'*: nom qualifié non conforme dans une déclaration de membre	
    en fait ce sont les paramètres out et binary qui posent problème.

  10. #10
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Pourrais-tu mettre les balises CODE et les accents dans tes messages ?


    Sinon je pense que tu as mal compris comment on initialise des attributs d'une classes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Foo
    {
             Foo(void);
              std::stringstream m_stream;
    }
     
    Foo::Foo(void)
       : m_stream(std::ios_base::out | std::ios_base::binary )
    {
     
    }
    On peut aussi faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Foo
    {
             int i = 5;
     
    }
    Mais cela ne marche que pour les entiers (?) et il me semble qu'en C++11 ils ont amélioré la chose, faudrait que je me rerenseigne sur le sujet.

    EDIT : Un peu d'informations ici.
    Paragraphe Class Member Initialization.
    Un autre lien.

    EDIT2 : Un lien français : http://cpp.developpez.com/redaction/...s/cpp11/#LII-B
    http://en.cppreference.com/w/cpp/language/data_members

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut
    Pour les balises codes je vais tenter si ca marche.

    En déclarant juste la variable, au niveau private je n'ai plus d'erreurs et en déclarant ceci au niveau du constructeur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CSock::CSock():ssdata(std::ios_base::in| std::ios_base::out | std::ios_base::binary )
    {
     
    etc .....
    }
    Ca fonctionne je n'ai plus d'erreurs. Donc maintenant cela veut dire que je peux utiliser cette variable dans toutes mes méthodes de ma Class ?

    Bizarre quand même, donc si j'ai dix variables de ce type à déclarer , je devrais les mettre au niveau de la déclaration de la class ?

    Merci pour ton aide en tous cas.

  12. #12
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    L'initialization de membre lors de la declaration est effectivement interdite, mais il me semble que ca dois marcher si C++11 est active.

  13. #13
    Membre expert

    Avatar de germinolegrand
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2010
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2010
    Messages : 738
    Points : 3 892
    Points
    3 892
    Par défaut
    Et l'initialisation à la déclaration est même ce qui se fait la plupart du temps en C++11. Ça économise un constructeur par défaut .

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/11/2010, 13h04
  2. [Error] String or binary data would be truncated.
    Par n00bi dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 04/08/2006, 16h57
  3. String or binary data would be truncated
    Par Pierre FORAZ dans le forum XMLRAD
    Réponses: 2
    Dernier message: 24/05/2006, 20h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo