Fichier texte

Fermé
naruto2333 Messages postés 51 Date d'inscription vendredi 21 mars 2014 Statut Membre Dernière intervention 20 janvier 2017 - 9 avril 2014 à 16:39
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 21 avril 2014 à 01:48
je manipule un peut les fichier texte sur c et j arrive pas a lire une valeur ou une chaine a partir d une ligne specifique

par exemple si le fichier est ecrit comme suit :

1 // ligne 1
2 // ligne 2

et moi je veut recuperer la valeur 2 dans une variable B par exemple ; moi je trouve pas une bonne methode
A voir également:

1 réponse

Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
9 avril 2014 à 20:06
Bonjour,

Dans un fichier texte le caractère \n pour saut de ligne est utilisé et sous windows le caractère \r le retour chariot est aussi utilisé il est combiné avec le saut de ligne de cette façon \r\n
Vous pouvez alors passer en revue chaque caractère du fichier en lecture pour déterminer le nombre de ligne en constatant les saut de ligne \n et en ignorant les retour chariot \r

Avec une comparaison un peu comme ça dans une boucle sur le buff de lecture (tout dépend de la façon utilisée pour charger les données du fichier), pour déterminer le nombre de ligne d'un fichier texte :
Si buffdelecture[i] == '\n' alors nombredelignes++
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
9 avril 2014 à 21:57
en constatant les saut de ligne \n et en ignorant les retour chariot \r
Il n'y a pas à les ignorer, lorsque tu liras le fichier, il n'y aura pas de '\r' mais que du '\n'.

Cdlt,
0
Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
Modifié par Hxyp le 12/04/2014 à 23:31
Et bien en fait ça doit dépendre de la façon dont on lit le fichier, je ne suis pas accro du fgets/fprintf etc j'ai toujours préféré gérer avec fread, chargement binaire avec le type char dans un buff fixe pour la lecture et je loop dessus pour extraire si besoin du coup dans le cas présent on récup aussi les \r et si on ne les ignore pas ça ne va pas le faire pour le traitement des lignes (leur extraction, stockage, parsing etc, enfin tout).
Admettons que je laisse passer les \r et que je stock mes lignes dans une liste en me basant sur le \n tout seul, à la fin de chaque ligne y aura le méchant \r ; voir au début s'il y a plusieurs \r à la suite ou sont placés n'importe où on ne peut pas le savoir à l'avance mais au moins éviter qu'ils ne tombent à la fin de la ligne car ça remettrait le curseur au début de ligne dans un printf et écraserait les suivantes (pas testé) etc en admettant qu'on veuille par la suite afficher la liste stockant chaque ligne avec les \r non ignorés lors du traitement ; et pour debugger j'imagine que ça doit être vraiment galère de trouver d'où vient le problème enfin c'était pour ça que j'avais rapidement écris que ça dépend de la façon utilisée pour charger les données du fichier, en prévision.

testé en fait ptit bout de code :
#include <stdio.h>
#include <stdlib.h>

int main(void){
    size_t c,n;
    char buff[32];
    FILE *f;
    f=fopen("test.txt","rb");
    if(f!=NULL){
        while((c=fread(buff,sizeof(char),32,f))){
            for(n=0;n<c;n++){
                if(buff[n]!='\n'){
                    printf("%#x ",buff[n]);
                } else printf("\nNew Line\n");
            }
        }
    } else printf("err fopen\n");
    return EXIT_SUCCESS;
}

On peut voir les 0xd à la fin des lignes lorsqu'on utilise ce type de chargement les ignorer c'est je pense une bonne solution.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
12 avril 2014 à 23:42
Je pense (mais je me trompe peut-être) que le fichier de naruto2333 est texte. Donc fgets() me semble plus approprié et in fine pas de '\r' donc même pas besoin de l'ignorer ;-).
Après effectivement pour des fichiers binaires, il peut - avoir des un '\r'. Mais je déconseille, surtout quand on commence la lecture binaire sur un fichier texte.
0
Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
13 avril 2014 à 00:00
Oui je pense aussi que ce doit être du texte néanmoins fread est la meilleur solution pour apprendre à charger les données d'un fichier le texte étant le format le plus simple. Car s'il utilise dés le départ fgets() ( je n'ai pas l'intention d'aller contre cette idée c'est un choix ) sans savoir comment cette fonction fonctionne en arrière plan (sans être capable de la reproduire) il n'arrivera jamais à comprendre pourquoi y a un \r dans le fichier texte quand il le lit avec un éditeur hexadécimal et que lorsqu'il lit le fichier avec fgets() il n'y est pas (ça lui prendra des plombes pour comprendre que ça vient du format employé; la notion de format est très importante quand on manipule des fichiers).; j'imagine
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
Modifié par fiddy le 13/04/2014 à 01:00
Tu as une vision drôlement simplifiée de l'OS ^^.
Les OS ont différentes façons de stocker du texte. La lecture en mode texte laisse justement le soin à l'OS d'effectuer ses propres conversions. Qui est mieux placé que lui pour faire cette tambouille ? En effet, cela ne se résume pas aux fins de lignes... Si tu veux lire en mode binaire du texte, il faudrait connaître la locale utilisée par le système, l'encodage, etc. Cela devient très vite compliqué, non portable et ne présente guère d'intérêt...
La bonne façon, et ce n'est pas pour rien que les bouquins d'apprentissage, les tutos vont dans ce sens, est de lire avec fgets() ou équivalent un fichier texte. Et pour le reste, il suffit de l'ouvrir en binaire.
0