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 :

Lire un fichier avec read()


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 4
    Par défaut Lire un fichier avec read()
    Bonjour,

    je dois créer un programme qui découpe des fichiers *.tar en C. Je dois utiliser la fonction read() pour lire le fichier et dans un premier temps, je compte juste l'afficher sans le traiter pour le moment, mais impossible d'afficher le contenu du fichier, j'obtiens juste 1 ligne vide. Pouvez vous m'aider ?

    Voici mon code :

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
     
    #define BLOCK_SIZE 512
     
    int main(int argc,char* argv[]){
    	if(argc<2){
    		printf("Erreur ! Il n'y a pas assez d'arguments !\n");
    	}
    	else{
     
    		int fd=open(argv[2],O_RDONLY,0);
    		int resRead=0;
    		char* buffer=(char*)malloc(BLOCK_SIZE*sizeof(char));
    		resRead=read(fd,(char*)buffer,BLOCK_SIZE);
    		printf("%s\n",buffer);
    		while(resRead>0){
    			printf("%s\n",buffer);
    			resRead=read(fd,(char*)buffer,sizeof(buffer));
    		}
    		close(fd);
    		free(buffer);
    	}
     
    	return 0;
    }
    Merci, bonne journée !

  2. #2
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Bonjour.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #line 18
    char* buffer=(char*)malloc(BLOCK_SIZE*sizeof(char));
    Je ne suis pas sûr que faire une allocation dynamique soit nécessaire dans ce cas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char buffer[BLOCK_SIZE];
    Ça suffit.
    Et comme ça, pas besoin de libérer la mémoire manuellement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #line 23
    resRead=read(fd,(char*)buffer,sizeof(buffer));
    Là, il y a une erreur.
    buffer est déclaré comme un char*, alors : sizeof(buffer) == sizeof(char*) == La taille d'un pointeur quelle que soit la taille de la zone mémoire allouée ! (FAQ C)
    L'expression de la ligne 19 est correcte.

    Par contre, la fonction read n'ajoute pas de caractère nul à la fin du tampon.
    Donc s'il n'y en a pas dans les données lues, tu risques de taper là où tu ne devrais pas lorsque tu veux afficher le contenu du tampon.
    Et si, au contraire, le tout premier caractère lu est un caractère nul, rien ne s'affichera (même s'il y a d'autres caractères après).
    Il faut penser, en n'oubliant pas que buffer ne peut contenir que BLOCK_SIZE caractères, caractère nul compris...

    Encore faut-il que ce soient bien des caractères que tu lis.
    Tu disais avoir des fichiers *.tar en entrée.
    Tu es sûr que tu peux lire directement des caractères depuis un tel fichier ?
    Il y a peut-être des drapeaux à utiliser pour la fonction open.
    Je ne suis pas un expert dans ce domaine, je ne peux pas t'aider plus.

    En tout cas, bon courage !

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 399
    Par défaut
    Des données brutes ne peuvent pas être affichées aussi facilement que du texte.
    Tu dois les mettre en forme, par exemple le format "éditeur hexa".

    PS: Pourquoi utilises-tu open/read au lieu de fopen/fread? S'agit-il de guidelines du genre d'Epita?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Lire un fichier avec awk
    Par lili2704 dans le forum Linux
    Réponses: 4
    Dernier message: 18/01/2007, 16h53
  2. lecture d'un fichier avec read
    Par seb__ dans le forum C
    Réponses: 6
    Dernier message: 01/10/2006, 19h42
  3. Réponses: 1
    Dernier message: 19/12/2005, 18h09
  4. Lire un fichier avec un charset UTF8
    Par Sonic dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 03/05/2005, 20h37
  5. [ZIP]besoin de lire des fichiers avec l'extension tar.gz
    Par mathieublanc13 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 24/05/2004, 14h35

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