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?
Version imprimable
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?
??
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.
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.
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)
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.
Sujets fusionnés, merci de rester dans le même fil pour le même problème.
:merci:
si tu travail avec un unix alors tu prend simplement un fstream et t'ouvre le fichier /dev/<le perif que tu veux>
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:
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?Code:
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();
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:
Est-il possible de faire la même chose?Code:
1
2
3
4 BufferedInputStream in = new BufferedInputStream(aSocket.getInputStream()); while (in.available()<=0); String chaine = in.readLine();
t'es pas très familier avec les unix toi :lol: fin bon là n'est pas la question... sous windows je n'ai pas le moindre idée de comment on fait.Citation:
fstream file("/dev/IRQ=21", ios_base::in);
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:
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.htmlCode:
1
2
3
4
5 istringstream iss("ceci est un text"); string text; while (iss >> text) cout << text << endl;
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.Citation:
Envoyé par zdra
:oops: je ne l'avais encore jamais utilisé mais son nom avait l'air bien sympatique :lol:
Bonjour a tous,
Hey bien oui j'ai réussi a ouvrir et fermer un Handle sur driver PCI de ce cette manière:
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'avanceCode:
1
2
3
4 HANDLE hdevice = CreateFile("\\\\.\\dig704",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL); ... CloseHandle(hdevice);
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).
Hum... :cry: :cry: :cry:
Il n'y a rien qui marche sur le mossus de périphérique PCI:
Sa marche pas... pire encore sa me cré un fichier du nom de mon pilote quand je donne juste "dig704".Code:
1
2
3
4 ifstream f("\\.\dig704"); while (true) cout << in.rdbuf();
Pis ça non plus sa marche pas.Code:
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); }
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.
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.Citation:
Envoyé par Philippe299