Lecture aléatoire des caractères d'un fichier
Fermé
dingue
-
17 déc. 2013 à 19:18
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 18 déc. 2013 à 16:04
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 18 déc. 2013 à 16:04
A voir également:
- Lecture aléatoire des caractères d'un fichier
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Caractères ascii - Guide
- Ouvrir un fichier .bin - Guide
5 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
17 déc. 2013 à 22:28
17 déc. 2013 à 22:28
Bonjour,
Et c'est quoi la question ? En quoi pouvons-nous t'aider ?
Et c'est quoi la question ? En quoi pouvons-nous t'aider ?
je voudrais faire ressortir dans une variable des caractères lus aléatoirement dans un fichier contenant ces caractères dans un certain ordre.
j'ai beau réfléchi ,je trouve pas comment je pourrais faire.
pouvez vous me secourir svp??
merci
j'ai beau réfléchi ,je trouve pas comment je pourrais faire.
pouvez vous me secourir svp??
merci
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/msg.h>
#include <errno.h>
#include <fcntl.h> /*O_RDONLY*/
#define TAILLE_MESSAGE 256 /* Correspond à la taille de la chaîne à écrire */
int main(void)
{
pid_t pid_fils;
int fd1;char c;
/* lecture du fichier composant.txt */
fd1=open ("composant.txt",O_RDONLY,0);
read(fd1,&c,1);
printf("c=%c\n",c);
int descripteurTube[2];
char messageEcrire[TAILLE_MESSAGE];
pipe(descripteurTube);
pid_fils = fork();
if(pid_fils != 0) /* Processus père */
{
sprintf(messageEcrire,"(c)" ); /* La fonction sprintf permet de remplir une chaîne de caractère avec un texte donné */
write(descripteurTube[1], messageEcrire, TAILLE_MESSAGE);
}
return EXIT_SUCCESS;
}
ce code ne lit que la premiere lettre du fichier composant
moi je voudrais faire lire de façon alternative plus d'un élément
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/msg.h>
#include <errno.h>
#include <fcntl.h> /*O_RDONLY*/
#define TAILLE_MESSAGE 256 /* Correspond à la taille de la chaîne à écrire */
int main(void)
{
pid_t pid_fils;
int fd1;char c;
/* lecture du fichier composant.txt */
fd1=open ("composant.txt",O_RDONLY,0);
read(fd1,&c,1);
printf("c=%c\n",c);
int descripteurTube[2];
char messageEcrire[TAILLE_MESSAGE];
pipe(descripteurTube);
pid_fils = fork();
if(pid_fils != 0) /* Processus père */
{
sprintf(messageEcrire,"(c)" ); /* La fonction sprintf permet de remplir une chaîne de caractère avec un texte donné */
write(descripteurTube[1], messageEcrire, TAILLE_MESSAGE);
}
return EXIT_SUCCESS;
}
ce code ne lit que la premiere lettre du fichier composant
moi je voudrais faire lire de façon alternative plus d'un élément
[Dal]
Messages postés
6203
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
29 janvier 2025
1 099
Modifié par [Dal] le 18/12/2013 à 16:07
Modifié par [Dal] le 18/12/2013 à 16:07
Salut dingue,
Une approche raisonnable serait de :
1- déterminer la taille de ton fichier, exemple (taille_fich) et le nombre de caractères à afficher (car_max, qui devra être au moins égal à taille_fich sans les retours à la ligne...), et mettre à zéro un compteur de caractères (compteur)
2- allouer un espace mémoire suffisant pour accueillir les données qu'il contient (tampon)
3- lire les données qu'il contient dans cet espace
4- tirer au sort un nombre entre 0 et taille_fich-1
5- afficher le caractère dans tampon à cet endroit sauf si c'est un \n
6- si c'est un \n, revenir à 4
7- sinon incrémenter compteur, et mettre le caractère dans tampon à cet endroit à \n (cela te permettra de savoir que celui-là n'est plus affichable)
8- si le compteur est égal à car_max, on a terminé
9- sinon, on boucle sur 4
Par rapport à ton code que tu postes là...
Pour lire plus d'un caractère, tu dois ... lire plus d'un caractère.
Si en 3ème argument de read tu mets 1, tu n'en lira pas plus.
man 2 read
Bien sûr, en 2ème argument tu devra mettre le tampon évoqué ci-dessus.
Il y a une raison pour laquelle tu utilises des fonctions POSIX open et read au lieu des fonctions standard du C fopen et fread ?
Par ailleurs, je ne comprends pas pourquoi tu pipe() ou fork(), et
Dal
Une approche raisonnable serait de :
1- déterminer la taille de ton fichier, exemple (taille_fich) et le nombre de caractères à afficher (car_max, qui devra être au moins égal à taille_fich sans les retours à la ligne...), et mettre à zéro un compteur de caractères (compteur)
2- allouer un espace mémoire suffisant pour accueillir les données qu'il contient (tampon)
3- lire les données qu'il contient dans cet espace
4- tirer au sort un nombre entre 0 et taille_fich-1
5- afficher le caractère dans tampon à cet endroit sauf si c'est un \n
6- si c'est un \n, revenir à 4
7- sinon incrémenter compteur, et mettre le caractère dans tampon à cet endroit à \n (cela te permettra de savoir que celui-là n'est plus affichable)
8- si le compteur est égal à car_max, on a terminé
9- sinon, on boucle sur 4
Par rapport à ton code que tu postes là...
Pour lire plus d'un caractère, tu dois ... lire plus d'un caractère.
Si en 3ème argument de read tu mets 1, tu n'en lira pas plus.
man 2 read
Bien sûr, en 2ème argument tu devra mettre le tampon évoqué ci-dessus.
Il y a une raison pour laquelle tu utilises des fonctions POSIX open et read au lieu des fonctions standard du C fopen et fread ?
Par ailleurs, je ne comprends pas pourquoi tu pipe() ou fork(), et
sprintf(messageEcrire,"(c)" );va juste écrire dans ton tampon "(c)", et non pas ce que tu as récupéré.
Dal
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
18 déc. 2013 à 16:04
18 déc. 2013 à 16:04
Bonjour,
Pourquoi utiliser des fonctions non standards ?
Utilise plutôt fopen(), fgetc() et fclose(). Ca sera plus simple, lisible et portable.
Pourquoi utiliser un fork ?
Pour lire un certain nombre de fois, il te suffit de tirer un nombre pseudo aléatoire (via srand() puis rand()).
Pourquoi utiliser des fonctions non standards ?
Utilise plutôt fopen(), fgetc() et fclose(). Ca sera plus simple, lisible et portable.
Pourquoi utiliser un fork ?
Pour lire un certain nombre de fois, il te suffit de tirer un nombre pseudo aléatoire (via srand() puis rand()).