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 :

Fichier en langage C


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 193
    Par défaut Fichier en langage C
    Bonjour,

    Si j'ai ouvert ce topic c'est pour avoir des informations sur comment manipuler les fichiers (écriture puis lecture). En fait je veux écrire un fichier qui soit du genre langage assembleur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    début: In R12,
              ADD R3, R4,#2"
    Ce texte est tapé au clavier et peut varier selon ce que l'on tape.

    Donc j'ai fait plusieurs tentative comme je peux vous laissez voir (aucun ne marche)La vérté cé que je n'ai po vrément compris comment on peut manipuler ces fichiers: jeudi j'ai eu un amphi où je n'ai rien compris (personne n'a compris dans ma classe). Donc je me suis documenter sur le net et sur un livre ("Le programmeur") mais tout reste flou dans ma tête


    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
     
    FILE* fichier = NULL;
     
        char chaine[100];
     
        fichier = fopen("test.txt", "a+");
     
     
     
        if (fichier != NULL){
                while(fgets(chaine,25,fichier)!=""){
                    chaine=gets(chaine);
                    fprintf("chaine)", "fichier");
                }
            }else{
                printf("Impossible d'ouvrir le fichier test.txt");
            }
        fclose(fichier);
     
        if (fichier != NULL)
        {
            while (fgets(chaine, 100, fichier) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
            {
                printf("%s", chaine); // On affiche la chaîne qu'on vient de lire
            }
     
            fclose(fichier);
        }
    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
        int count;
        char buf[SIZE];
        char*tmp[50];
        FILE *fp;
     
     
        fp=fopen("text.txt","a+");
     
        if((fp==NULL)){
           printf("Impossible d'ouvrir le fichier.txt");
        }
     
            for(count=0;count<50;count++){
                scanf("%s",&tmp[count]);
                fprintf(fp, "%s", tmp[count]);
            }
            fprintf(fp,"\n");
     
        fclose (fp);
    Ce serait sympa que quelqu'un puisse me dépanner svp...

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 193
    Par défaut
    Merci beaucoup... Je viens de lire vos document ça a l'air légèrement plus clair dans ma tête... Maintenant qu'à voir sur le plan pratique^^

    Voici maintenant ce que j'ai fait (côté écriture ça a l'air de marché, côté lecture ça ne marche pas)

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    void ecriture(FILE *f, char *tab){
        f = fopen("test.tab", "wb");
        if (f == NULL)
            perror("test.tab");
        else
        {
            fwrite(tab, sizeof(tab[0]), sizeof(tab) / sizeof(tab[0]), f);
            fclose(f);
        }
     
    }
     
    void lecture(FILE *f, char *tab){
        f = fopen("test.tab", "rb");
        if (f == NULL)
            perror("test.tab");
        else
        {
            int n, i, tab[10];
            n = fread(tab, sizeof(tab[0]), sizeof(tab) / sizeof(tab[0]), f);
            for(i = 0; i < n; i++)
                printf("%d\n", tab[i]);
            fclose(f);
        }
     
     
    }
    int main(int argc, char** argv) {
        char tab[50];
        FILE* f;
        while(gets(tab)!='²'){
            ecriture(f, tab);
        }
        while(f!=NULL){
            lecture(f,tab);
        }
     
        return (EXIT_SUCCESS);
    }

  4. #4
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Dans ta fonction ecriture ceci est incorrect :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sizeof(tab) / sizeof(tab[0])
    Sachant que tu récupères un pointeur tu auras la taille d'un pointeur (4 ou 8 octets sûrement). Du coup tu écriras 4 ou 8 octets dans ton fichier et pas plus.

    Je ne sais pas trop ce que tu as voulu faire ici mais si tu voulais comparer un caractère de ta chaîne avec le carré ce n'est pas comme ça qu'on fait. De plus le carré n'est pas dans la table ascii donc tu peux avoir des problèmes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(gets(tab) != '²')
    Dans ta fonction lecture tu envoies le paramètre *tab et dans ton else tu redéclares tab. Ce n'est pas incorrect mais fait attention le tab du else n'est pas le même que celui de ta fonction !

    Dans ton main tu fais 'while(f != NULL)', si tu veux mon avis tu as toutes les chances de créer une boucle infinie.

    Pour finir : Je ne vois pas pourquoi tu t'embêtes avec les fichiers binaires alors que tu manipules des chaînes de caractères. Une ouverture simple ("r" "w") suffit amplement.

    @+

  5. #5
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    @bsangoku : Tu t'es effectivement amélioré du côté de la manipulation des fichiers mais t'es handicapé par une compréhension encore très mauvaise du C lui même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void ecriture(FILE *f, char *tab){
    1. Si tu passes f en paramètre de la fonction, c'est qu'il doit déjà pointer sur un fichier normalement ouvert. Si tu n'as pas encore de fichier ouvert, laisse à la fonction elle-même de l'ouvrir et tu n'auras donc pas à passer un pointeur vers le fichier.

    2. tab ici est un pointeur (char *). Il va probablement contenir l'adresse du premier élément d'un tableau qu'on veut passer à la fonction. Si la fonction a besoin de connaître le nombre d'éléments dans ce tableau, il faut le lui fournir un troisième argument car le pointeur tab ne permet pas de connaître cette taille (un pointeur contient juste une adresse, rien d'autre).

    Je vais donc réécrire ta fonction ecriture en la renommant ecrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void ecrire(const char * tab, size_t nb_elements)
    {
        f = fopen("test.tab", "wb");
        if (f == NULL)
            perror("test.tab");
        else
        {
            fwrite(tab, sizeof(tab[0]), nb_elements, f);
            fclose(f);
        }
    }
    Pourquoi const char * au lieu de char * simplement ? Parce que ça garantit que notre fonction ne modifiera pas les données pointées par tab. Voir cours pour plus d'explications.

    Pourquoi size_t au lieu de int ? Parce que c'est le type qui permet de représenter au mieux la taille d'un objet. C'est évidement un type entier (non signé).

    Mêmes remarques pour la fonction lecture (que tu renommerais donc en : lire), mais j'ajoute également que tu n'as pas à lui fournir un tableau puisque tu déclares déjà un tableau (et ça doit être char tab[10] ou int tab[10] en fait ?) à l'intérieur (dans le bloc else). Assure-toi donc de ne jamais lire un fichier qui contient plus de 10 octets (puisque c'est la taille de ton tableau) sinon, agrandis ton tableau.

    Dans la fonction main, tu utilises mal la fonction gets. Voici un exemple simplifié :
    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
    int main()
    {
        char tab[10];
     
        printf("Entrez une chaine (9 caracteres max. svp) : ");
        gets(tab);
     
        printf("Ecriture ...\n");
        ecrire(tab);
     
        printf("Lecture ...\n");
        lire();
     
        return 0;
    }
    Ajoute une boucle si tu veux mais utilise les bonnes fonctions (la comparaison de chaînes par exemple se fait avec la fonction strcmp et non avec ==, !=, etc.). Ce n'est pas sur le forum que ca s'apprend mais avec les cours, livres, etc. Il y a de bons cours de langage C ici.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 193
    Par défaut
    Merci (désolé de vous répondre un peu tard: la vérité c'est que je croyais vous avoir répondu et non). J'ai lu durant ces deux jours les tutoriels que vous m'avez présenté. Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Normales et fichier md5 (langage C)
    Par Ninqueelen dans le forum OpenGL
    Réponses: 6
    Dernier message: 15/10/2013, 18h13
  2. Ouvrir des fichiers en langage R
    Par riadmims dans le forum R
    Réponses: 3
    Dernier message: 24/05/2012, 09h23
  3. fichier texte (langage C)
    Par noussa309 dans le forum Débuter
    Réponses: 3
    Dernier message: 21/10/2011, 16h10
  4. [Traitement de fichier] Quel langage choisir?
    Par frutix dans le forum Langages de programmation
    Réponses: 3
    Dernier message: 06/02/2010, 15h54
  5. Fichier en langage c
    Par bsangoku dans le forum Débuter
    Réponses: 12
    Dernier message: 13/01/2010, 18h12

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