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 :

Les flux non standard


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 49
    Par défaut Les flux non standard
    Comment je pourrais créer un flux qui n'utiliserais pas les I/O standard. Comme par exemple, si je veux créer un flux qui serais diriger sur une carte PCI, comment je ferais?

  2. #2
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    ??
    En regardant la doc des matériels sur lesquels tu travailles ?
    Rien de tel n'est normalisé dans le C++98.

    Et puis, la notion de flux est super vague hors du contexte IOStream.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #3
    Membre éprouvé Avatar de Kurdran
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 122
    Par défaut
    Si tu es sous Linux ou Unix tu peux utiliser les fichiers spéciaux.

    Si tu es sous Win ben la je ne sais pas.

  4. #4
    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
    Si tu veux pouvoir écrire comme dans un flux, mais ailleurs que dans un fichier, une chaîne en mémoire ou une console, les flux standards sont fait pour ça. L'idée est de dériver non pas tant des *stream, mais plutôt du *streambuf.

    Tu peux voir un exemple sommaire sur http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/#flux_entree_sortie

    (paragraphe 27.3)
    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.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 49
    Par défaut cin freopen?
    Je me demandais, pour mon problème ou je veux lire sur une carte PCI à l'aide d'un flux, est-ce que c'est bon de faire un freopen(ma_device,"r",stdin). J'ai essayer de le faire sur un fichier sur disque sa marche(cin >> ligne), mais pour un autre périphérique est-ce bon? Avez-vous un exemple par exemple sur un fax ou un scanner par exemple.

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Sujets fusionnés, merci de rester dans le même fil pour le même problème.


  7. #7
    Membre expérimenté
    Avatar de zdra
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2002
    Messages : 164
    Par défaut
    si tu travail avec un unix alors tu prend simplement un fstream et t'ouvre le fichier /dev/<le perif que tu veux>

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 49
    Par défaut PCI et Flux
    Sous windows, comment je pourrais faire alors si sur Unix j'aurais simplement a faire un fstream sur /dev/<mon périphérique>, donc si je donne un exemple de code sous Unix ce serais comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    fstream file("/dev/IRQ=21", ios_base::in);
    char data[255];
    while (file>>data)
    {
        // traitement des informations
    }
    file.close();
    Avec Windows alors comment je pourrais faire pour trouver le périphérique. Puis il serais t-il possible que je pourrais pas lire pour n'importe quelle raison?

    J'ai une question aussi par rapport a la lecture. En Java pour savoir s'il y avait des informations à lire dans le flux j'utilisais des méthodes comme available() comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    BufferedInputStream in = new BufferedInputStream(aSocket.getInputStream());
    while (in.available()<=0);
    String chaine = in.readLine();
    Est-il possible de faire la même chose?

  9. #9
    Membre expérimenté
    Avatar de zdra
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2002
    Messages : 164
    Par défaut
    fstream file("/dev/IRQ=21", ios_base::in);
    t'es pas très familier avec les unix toi fin bon là n'est pas la question... sous windows je n'ai pas le moindre idée de comment on fait.

    Pour savoir si il y a encore à lire, le mieux c'est de lire et voir si ça n'a pas fait une erreur... du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    istringstream iss("ceci est un text");
    string text;
    while (iss >> text)
      cout << text << endl;
    l'oppérateur >> retournera un false si la lecture a été faite alors qu'il n'y a plus rien à lire. Sinon t'as aussi le eof(): http://www.cplusplus.com/ref/iostream/ios/eof.html

  10. #10
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Citation Envoyé par zdra
    l'oppérateur >> retournera un false si la lecture a été faite alors qu'il n'y a plus rien à lire. Sinon t'as aussi le eof()
    Non. eof() est un faux ami. Tant que l'on ne se sera pas cogné dans le mur, eof ne nous dira pas qu'on y est arrivé. Je me sers essentiellement après une tentative d'extraction de nombre (et encore, il y a d'autres façons) et jamais pour boucler sur un flux.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  11. #11
    Membre expérimenté
    Avatar de zdra
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2002
    Messages : 164
    Par défaut
    je ne l'avais encore jamais utilisé mais son nom avait l'air bien sympatique

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 49
    Par défaut Lire sur un Driver
    Bonjour a tous,

    Hey bien oui j'ai réussi a ouvrir et fermer un Handle sur driver PCI de ce cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    HANDLE hdevice = CreateFile("\\\\.\\dig704",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
    ...
    CloseHandle(hdevice);
    Mais là j'ai un autre problème, si je veux lire sur le driver, comment je dois faire, j'ai lu pas mal et j'ai plusieurs source. Sur un site il me dise d'utiliser la fonction DeviceIoControl, sur d'autre c'est marquer d'utiliser ReadFile, comme je dois faire. Merci d'avance

  13. #13
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    ReadFile c'est plus simple, ça revient à utiliser DeviceIOControl avec les paramètres adaptés à la lecture. Mais le comportement dépend uniquement du bon vouloir du driver.
    Si ça marche, à priori, ça devrait marcher avec un ifstream (le même code que tu as donné plus haut, mais avec le bon nom de driver).

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 49
    Par défaut
    Hum...

    Il n'y a rien qui marche sur le mossus de périphérique PCI:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ifstream f("\\.\dig704");
    while (true)
        cout << in.rdbuf();
    Sa marche pas... pire encore sa me cré un fichier du nom de mon pilote quand je donne juste "dig704".
    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
     
    HANDLE hdevice = CreateFile("\\.\dig704",GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_TEMPORARY,NULL);
    if (hdevice!=INVALID_HANDLE_VALUE)
    {
        while(true)
        {
            char dataIn[128];
            DWORD byteRead = 0;
            int index=0;
            if (ReadFile(hdevice,dataIn,sizeof(dataIn),&byteRead,NULL)!=0)
                cout << "Data: " << dataIn << endl;
            ::Sleep(500);
        }
        CloseHandle(hdevice);
    }
    Pis ça non plus sa marche pas.

    J'ai essayer de contacter le fabricant du driver et de mes censeurs pour leurs demanders les IOCTL(pour ma dernière solution qu'est DeviceIOContro) du driver, voir si ça va marcher. Espérant qu'ils vont me les envoyers. D'ici là y aurait tu kekun qui aurait des idées.

  15. #15
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Citation Envoyé par Philippe299

    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
     
    HANDLE hdevice = CreateFile("\\.\dig704",GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_TEMPORARY,NULL);
    if (hdevice!=INVALID_HANDLE_VALUE)
    {
        while(true)
        {
            char dataIn[128];
            DWORD byteRead = 0;
            int index=0;
            if (ReadFile(hdevice,dataIn,sizeof(dataIn),&byteRead,NULL)!=0)
                cout << "Data: " << dataIn << endl;
            ::Sleep(500);
        }
        CloseHandle(hdevice);
    }
    Pis ça non plus sa marche pas.
    Avec les API windows, tu as la fonction GetLastError qui te permet de savoir ce qui a cloché lors de l'appel à la fonction CreateFile. Déjà vérifies quel code d'erreur te renvoie cette fonction. C'est peut-être tout simplement l'utilisation de paramètres erronés ou alors une question de "droits d'ouverture et d'écriture" ou autres choses encore.

Discussions similaires

  1. [PL/SQL] Supprimer les caractères non numériques
    Par Oliveuh dans le forum PL/SQL
    Réponses: 6
    Dernier message: 25/06/2015, 12h13
  2. [SWI-Prolog] Les flux "standards" ?
    Par Alp dans le forum Prolog
    Réponses: 5
    Dernier message: 26/06/2008, 23h03
  3. Repérer les flux non fermés et autres
    Par Davboc dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 26/11/2007, 12h11
  4. Le linker ignore les fonctions non implémentées
    Par Rodrigue dans le forum C++Builder
    Réponses: 5
    Dernier message: 02/03/2005, 13h31

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