Je tenais à vous remercier tous pour l'aide que vous m'avez apporté
Bien à vous.
ara.
Forum Programmation.c programme c qui émule la commande cat (solution trouvée hipipip houraaaaaaaaaaaa)
Posté par ara .
Étiquettes :
aucune
7
déc.
2006
# ta solution ?
Posté par Cereal Killer . Évalué à 2.
[^] # Re: ta solution ?
Posté par ara . Évalué à 1.
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main (int argc, char*argv[])
{
int i;
int byte_lu;
int d;
char tampon [1024];
ssize_t fd;
for (i=1; i<argc; i++)
{
d= open(argv[i],O_RDONLY);
if(d==-1)
{
printf("these file does not exist check the name\n");
return(2);
}
Else{
While((byte_lu=read(d,tampon,1024)) >0){
fd= write(STDOUT_FILENO,tampon,byte_lu);
close(d);
}
}
Return(0) ;
}
[^] # Re: ta solution ?
Posté par ara . Évalué à 0.
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main (int argc, char*argv[])
{
int i;
int byte_lu;
int d;
char tampon [1024];
ssize_t fd;
for (i=0; i<argc; i++)
{
d= open(argv[i],O_RDONLY);
if(d==-1)
{
printf("these file does not exist check the name\n");
return(2);
}
Else{
While((byte_lu=read(d,tampon,1024)) >0){
fd= write(STDOUT_FILENO,tampon,byte_lu);
close(d);
}
}
Return(0) ;
}
Content?
[^] # Re: ta solution ?
Posté par alf . Évalué à 4.
while ((byte_lu = read(d, tampon, 1024)) > 0) { fd = write(STDOUT_FILENO, tampon, byte_lu); close(d); }Le close se trouvant dans la boucle, tu n'afficheras au plus que 1024 octets de chaque fichier. Le close devrait se trouver en-dehors de la boucle while. Sinon, ton programme fait bien ce qu'il faut (en passant, ça ne sert à rien de récupérer la valeur de retour de write si tu ne l'utilises pas).[^] # Re: ta solution ?
Posté par Cereal Killer . Évalué à 2.
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdio.h> void usage(char **av) { printf("Usage: %s [FILES] ...\n", av[0]); } int main (int ac, char **av) { int i, fd; ssize_t byte_lu; char buffer[1024]; if (ac < 2) usage(av); for (i=1; i<ac; i++) { fd = open(av[i],O_RDONLY); if (fd == -1) perror("open: "); else { while((byte_lu=read(fd,buffer, sizeof(buffer)))) write(STDOUT_FILENO, buffer, byte_lu); close(fd); } } return 0; }Et comme je sais que d'autres ont leur solution, j'aimerais la voir aussi (si ça les dérange pas évidemment) :) (on a toujours à apprendre du code des autres)[^] # Re: ta solution ?
Posté par alf . Évalué à 2.
Sauf que write attend un troisième argument de type size_t, et que tu lui donnes la valeur-1. size_t étant non signé, la conversion se fait modulo la valeur maximale représentable par ce type +1, soit SIZE_MAX + 1. write reçoit donc la valeur SIZE_MAX (i.e. SIZEMAX + 1 - 1). write va donc essayer de lire autant d'octets dans ton tableau pour les écrire... D'où un comportement indéfini par :
- lecture de données non initialisées si c'est le tout premier appel à read qui plante ;
- et débordement de tableau dans le cas quasi-certain où SIZE_MAX est supérieur à 1024.
A part ça, question de style, je place toujours les accolades autour des blocs if, else, while... Surtout, quand le bloc d'un if est entre accolades, je mets les accolades aussi autour du bloc else (et réciproquement), même si un des blocs ne fait qu'une ligne. Je dis ça surtout par rapport à ton :
if (fd == -1)
perror("open: ");
else
{
/* ... */
}
# plusieurs posts pour le meme sujet
Posté par NeoX . Évalué à 3.
Debut du probleme :
http://linuxfr.org/forums/19/19853.html
Suite
http://linuxfr.org/forums/19/19861.html
Et fin : ici
[^] # Re: plusieurs posts pour le meme sujet
Posté par spotty . Évalué à 1.
Dans l'autre cas
byte_lu = retour de fonction read, et comme 0=0 est vrai, alors boucle infinie :-), en fait on aurait du avoir (byte_lu=read()) != 0
http://man.developpez.com/man2/read.2.php
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.