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

C++ Discussion :

Lecture dans un fichier ligne par ligne impossible


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de tontonrichmon
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 16
    Par défaut Lecture dans un fichier ligne par ligne impossible
    Bonjour,

    Je dois faire en sorte que mon programme puisse écrire dans un fichier et que ce fichier se fasse ensuite parcourir. Le contenu sera alors envoyé à un serveur via TCP/IP.
    L'écriture se fait correctement, j'ai pu le vérifier en constatant que mon fichier texte contenait les bonnes données.
    Cependant, il m'est impossible de pouvoir lire ce fichier afin d'envoyer ligne par ligne les données au serveur grâce à une boucle getline.

    Voici les codes correspondant aux parties renconcrant le problème:

    (Thread pour la reception des données et leur inscription dans le fichier)

    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
    DWORD BluetoothThread::ClientThread(SOCKET soc, SOCKADDR *pAdd)
    {
        WSAQUERYSET     service;
        CSADDR_INFO     csAddr;
        int             ilen, nbAdd, compteur;
        SOCKADDR_BTH    sab2;
        SOCKET          NewConnection;
     
        ofstream fichier("test.txt", ios::out | ios::trunc);        // ECRASE
        //ofstream fichier("test.txt", ios::out | ios::app);        // AJOUTE
     
        cout << endl << "!--      Thread client demarre       --!" << endl;
     
        memset(&service, 0, sizeof(service));
        service.dwSize = sizeof(service);
     
        GUID serviceID = SAMPLE_UUID ;
        service.lpServiceClassId = (LPGUID) &serviceID ;
        service.dwNumberOfCsAddrs = 0 ;
     
        service.dwNameSpace = NS_BTH ;
     
        memset(&csAddr, 0, sizeof(csAddr));
        csAddr.LocalAddr.iSockaddrLength = sizeof(SOCKADDR_BTH);
        csAddr.LocalAddr.lpSockaddr = pAdd;
        csAddr.iSocketType = SOCK_STREAM;
        csAddr.iProtocol = BTHPROTO_RFCOMM;
        service.lpcsaBuffer = &csAddr;
     
     
        running = true;
        ilen = sizeof(sab2);
     
        while(running)
        {
            if( (NewConnection = accept( soc, (struct sockaddr*)&sab2, &ilen)) == INVALID_SOCKET )
            {
                Affiche_Erreurs( WSAGetLastError() );
                return 1;
            }
            else
            {
                wprintf (L"\nConnection entrante de : %04x%08x par le channel : %d\n", GET_NAP(sab2.btAddr), GET_SAP(sab2.btAddr), sab2.port);
                memset(buffer, 0, sizeof(buffer));
     
                recv(NewConnection,(char*)buffer,1, 0);
     
                nbAdd=(int)buffer[0];
                cout << "Nombre de boucles : " << (int)buffer[0] << endl << endl;
     
                for(compteur=0; compteur<nbAdd; compteur++)
                {
                    nombre_co++;
                    recv(NewConnection,(char*)buffer, sizeof(buffer), 0);
                    fichier << buffer << " : " << QDateTime::currentDateTime().toString().toStdString().c_str() << endl ;
                    cout << "- Retour " << compteur+1 << ": " << buffer << endl;
                }
     
                mess_retrn = buffer;
                string str_crypt;
                cryp->vigenere_crypter(mess_retrn,str_crypt,cle);
                mess_retrn = str_crypt;
     
                closesocket(NewConnection);
            }
        }
     
        if (WSASetService(&service, RNRSERVICE_DELETE, 0) == SOCKET_ERROR)
            Affiche_Erreurs( WSAGetLastError() );
     
        shutdown(soc,2);
        closesocket( soc );
        fichier.close();
     
        ExitThread(0);
     
        return 0;
    }
    (Thread pour la lecture du fichier et l'envoie au serveur)

    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
    DWORD CServeurTcp::ClientThread(SOCKET soc)
    {
        ifstream fichier("test.txt", ios::in);
        string ligne, mess_crypt, donnees;
     
        if(fichier)
        {
     
            while(running)
            {
                cout << "RUNNING" << endl;
                    while(getline(fichier, ligne))
                    {
                        cryp->vigenere_crypter(ligne,mess_crypt,"VIGE");
                        donnees = salle + " - " + mess_crypt;
                        emis = send(soc, donnees.c_str(), strlen(donnees.c_str()), 0);
                        if(emis == SOCKET_ERROR)
                            Affiche_Erreurs( WSAGetLastError() );
                        else
                            cout << "Nombre de caracteres envoyes: " << strlen(buffer) << endl;
                    }
     
                Sleep(1000);
            }
            fichier.close();
        }
        else
            cout << endl << "Impossible d'ouvrir le fichier !" << endl;
     
     
        ExitThread(0);
     
        return 0;
    }

    Merci de votre aide, en vous souhaitant une bonne journée !

  2. #2
    Membre émérite Avatar de SkyZoThreaD
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2013
    Messages
    585
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2013
    Messages : 585
    Par défaut
    Citation Envoyé par tontonrichmon Voir le message
    il m'est impossible de pouvoir lire ce fichier afin d'envoyer ligne par ligne les données au serveur grâce à une boucle getline.
    C'est à dire? Le fichier n'est pas ouvert ? Les données lues sont incorrectes ?

  3. #3
    Membre averti Avatar de tontonrichmon
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 16
    Par défaut
    En effet j'en oublie même jusqu'à évoquer mon problème, exact.
    Donc, le contenu de la boucle while(getline(fichier,ligne)), devant s'effectuer à chaque ligne du fichier ne se lance pas. J'ai pu le déterminer en constatant que les cout inscris dedans ne s'affiche pas.
    Cependant, la boucle running est bien parcourue.

    J'espère avoir été clair. Merci

  4. #4
    Membre émérite Avatar de SkyZoThreaD
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2013
    Messages
    585
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2013
    Messages : 585
    Par défaut
    Il semble que getline ne retourne pas de valeur positive...
    Il faudrait récupérer la valeur retournée par ce dernier, voir mieux: insérer ton while (dont la condition est le getline) dans un bloc try/catch pour intercepter l’exception.
    If the operation sets an internal state flag that was registered with member exceptions, the function throws an exception of member type failure.
    source

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Question bête : L'écriture et la lecture ont-elles lieu en même temps (l'utilisation du terme thread me fait penser à ça)... Si oui, le ofstream va prendre un lock sur le fichier, et le ifstream va avoir du mal à tourner...
    L'ouverture du fichier sans prendre de lock est généralement possible, mais je ne crois pas qu'il y ait des fonctions standard pour ça. Pourquoi passes-tu par un fichier ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Membre averti Avatar de tontonrichmon
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 16
    Par défaut
    Tout d'abord, merci de vos réponses,

    La lecture et l'écriture "peuvent" en effet se passer au même moment en effet.

    Dans mon programme je dois recevoir des données, les stocker avant de les renvoyer via une seconde classe.
    J'ai donc utilisé le système d'écriture dans un fichier afin de permettre la sauvegarde des informations reçues.

    Dans mon esprit, il me semble que le même fichier est ouvert en écriture et en lecture par deux classes distinctes.
    La première reçoit des informations et les stockent dans ce fichier. Parallèlement, dans la seconde, une boucle permettant de lire le contenu du fichier et de l'envoyer est mise en place.
    A chaque fois qu'une ligne est créée grâce à la première classe, la seconde la lit et l'envoie.

    Aurais-je omis un détail?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 03/07/2014, 18h08
  2. lire fichier .txt (NOTEPAD) ligne par ligne
    Par skambram dans le forum VB.NET
    Réponses: 1
    Dernier message: 06/06/2009, 18h41
  3. lire un fichier de string ligne par ligne
    Par bilzzbenzbilz dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 11/02/2009, 10h44
  4. Lecture dans un fichier Word par pgm Delphi
    Par Bouillon dans le forum Langage
    Réponses: 12
    Dernier message: 19/11/2008, 16h35
  5. Réponses: 12
    Dernier message: 14/05/2008, 17h15

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