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);
}
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);
}
While et Return n'existent pas en C (ni en POSIX), donc ton code tel que posté ne compile pas. Je suppose qu'il y a eu une erreur de copié-collé et qu'un éditeur de texte malappris aura ajouté de lui-même les majuscules.
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).
#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)
Je n'y avais pas fait attention avant, mais read renvoie -1 dans certains cas d'erreur (SUSv3 précise plusieurs cas). Dans ce cas, la valeur -1 est affectée à byte_lu (qui est signé donc il n'y a pas de problème) puis, -1 étant non nul, la condittion de ton while est vraie. Le write est donc exécuté.
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
{
/* ... */
}
# 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.
[^] # Re: ta solution ?
Posté par Cereal Killer . Évalué à 2.
[^] # 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.