[C] Lire un fichier ligne par ligne

Fil fermé
Partager Rechercher
Citation :
Publié par Mertyl
Jecomprend pas pourquoi c'est si compliqué. :\
Parce que tu veux recoder ta fonction FileReadLine() .
Celle ci n'existe pas en C.

Mais regarde le man de la fonction lseek(), dans le cas dun simple fichier il faut pas chercher plus compliker.
Je veux bien te pondre le code, mais ce que tu veux c'est apprendre, alors il faut te forcer a te demerder par toi meme.
claire que pour une
Ouverture
Lecture
Traitement (..)
fermeture

de fichier donc, ca me parait un poile le bordel ce qui est proposer...non ?

est-ce du a la syntaxe du C ? (que je ne connais pas)

on devrait retrouver 3 fonction (open/read/close) plus une boucle de traitement on va dire.....

Citation :
#define BUFF_SIZE 1024


static int lenstr(char *str)
{
char *bak;

if (!str || !*str)
return (0);
bak = str;
while (*str)
str++;
return (str - bak);
}

static int find_nl(char *str)
{
char *bak;

bak = str;
if (str)
while (*str)
if (*str++ == '\n')
return (str - bak - 1);
return (-1);
}

static char *get_next_nl(char **str)
{
int pos;
int len;
char *ret;
char *bak;

if ((pos = find_nl(*str)) == -1)
return (NULL);
if (!(ret = malloc((pos + 1) * sizeof(*ret))))
exit (0);
bak = ret;
while ((ret - bak) < pos)
*ret++ = *((*str)++);
*ret = 0;
if (!(ret = malloc(((len = lenstr(*str)) + 1) * sizeof(*ret))))
exit (0);
while (**str)
vr *ret++ = *(++(*str));
free(*str - len - pos);
*str = ret - len;
return (bak);
}

static char *concat_string(char *old, char *buf, int n)
{
char *ret;
char *bak;

if (!(ret = malloc((lenstr(old) + n + 1) * sizeof(*ret))))
exit (0);
bak = ret;
if (old)
while (*old)
*ret++ = *old++;
*(ret + n) = 0;
free(old - (ret - bak));
while (n--)
*(ret + n) = buf[n];
return (bak);
}

char *get_next_line(int fd)
{
char *ret;
int nb_read;
static char *old;
char buf[BUFF_SIZE];

while (!(ret = get_next_nl(&old)))
{
nb_read = read(fd, buf, BUFF_SIZE);
if (!nb_read)
{
ret = old;
old = 0;
return (ret);
}
old = concat_string(old, buf, nb_read);
}
return (ret);
}
??????????????????????????????????????????????????????

je veut dire j'ai jamais fait de c, mais d'un point de vu algorithmie ce que demande Mertyl est simple : une lecture de fichier.
après je conçois bien que ce forum est un forum d'entraide mais pas un forum spécialisé et que donc que la pauvre Mertyl ce fasse réprimander.

et je me dit que finalement vu les solutions proposer, leur complexités, que peut être finalement le conseil d'aller sur Développez.com est le mieux pour Mertyl.

PS: dans tout les langage que je connais pour lire un fichier on retrouve :
une fonction d'ouverture
une de lecture
une de fermeture
et généralement 3 variable pour récupérer le renvoi de ces fonctions.
on va dire aussi une boucle qui en capsule le traitement et ou on met la fonction de lecture donc.

et bon dans tous les langage que j'ai pratiquer jusqu'à la on va dire qu'en 10ligne on pose le tout..... j'avoue que j'ai un peut de mal a voire ce charabia là(quoter plus haut).
loin s'en faut mais cette personne n'a jamais fait d'algo et ne répond pas a la question ou alors je suis bien heureu de ne pas avoir fait de C.
s'il faut 100 ligne pour ouvrir un fichier c'est pas gagné
Pour la troisieme fois.

Il y a en effet ouverture, lecture, fermeture.
Mais en C pour lire on donne le nombre de caracteres a lire. Si tes lignes font 10 caracteres et que tu en li 15, tu lira donc 1 ligne et demi.
Donc si tu veux lire ligne par ligne, tu as 3 solutions.

Solution simple mais pas optimisee :
Tu lis les caracteres un a un. Quand tu vois que tu es a un \n ou \0, tu passe a la suivante.

Solution simple mais specifique aux fichiers :
Tu avec un buffer plus gros que ta ligne. Tu recupere ce qui tinteresse. Ensuite tu te replace dans le fichier au bon endroit.

Solution optimisee et ultra polyvalente :
Tu lis avec un buffer quelconque. Tu concatene tes buffers juska arriver a la fin de la ligne. Tu va probablement depasser donc il faut sauvegarder ce qui depasse. Tu passe a la ligne suivante, et tu concatene juska arriver au bout. C'est cette solution que propose epigrogru.
C'est moche paske c'est de la manipulation de pointeur a tout va.


Cette fonction (enfin une des 3) n'existe pas dans la libc standard. Donc il faut la recoder.
Quand tu utilise tes langages "en 10 lignes" tu utilises plein de fonctions precoder. Ba la non. Le C est un vieux langage (mais j'adore)

Donc non on ne se fou pas de sa gueule.
D'ailleurs si il a coder un puissance 4 en reseau avant ca c'est pas pour rien


Le C est justement bien pour apprendre l'algoritmie. Je me surprends a faire des algo en C quand je code dans d'autres langages .

Et ce charabia comme tu dis est tout a fait imbuvable pour tout le monde ne t'en fais pas


[Edit] JAI DING ANNNNNNNNNNNNNGGGGGGGGGEEEEEEEEEEEE
A noter que je trouve quand même la méthode de traitement du fichier peut-être un poil inadaptée au C. Je ne sais pas ce qu'il veut faire avec ensuite avec, mais je pense que ça doit pouvoir se faire plus aisément.

Citation :
Code:
/* Lecture du fichier ligne par ligne */

for (i=0; i<50; i++)
{
printf("%c", tab[i]);
}
Je ne vois absolument pas ce que tu espères faire avec ce truc-là. Tu as un tableau de pointeurs, et tu lui dis d'afficher des char... ?!
Si c'est pour afficher ton fichier à l'écran, je n'en vois pas l'utilité, autant faire un truc genre printf(read(file));

Et mertyl ne se fait pas réprimander parce que ce n'est pas un forum spécialisé, mais parce qu'il pose des question sans connaître ne serais-ce que la syntaxe du langage qu'il essaie d'utiliser. C'est assez ennuyant à force. Je n'ai rien contre aider quelqu'un qui a des problèmes avec du code, au contraire, mais là quand même faut pas pousser. C'est systématique, et c'est systématiquement les mêmes problèmes. :/

Lango: rien...
autant pour moi alors je savais pas.

pourtant la lecture séquentiel de fichier est une chose qu'on vois dans beaucoup de langage.
par exemple en PowerScript la fonction de lecture peut être utiliser de trois façons :
le fichier complet (rarement utiliser)
une lecture séquentiel (ligne par ligne la plus couramment utiliser)
et une autre séquentiel index (la même que plus haut avec un index).

en java en 10 ligne on fait une ouverture lecture fermeture de fichier.

bref je me pose des questions sur le C du coup,
de manière séquentiel, la plus part des fonctions préprogrammées de lecture lit jusqu'à un certain caractère ("la touche entrer",...) a chaque appelle de lecture.

donc je pense que cette méthode doit pouvoir quand même être faite en C au lieu de se baser sur le nombre de caractère que compose la ligne pourquoi ne pas se baser sur le caractère de renvoi a la ligne ?
Citation :
Publié par Fable
Surtout que le code il est déjà dans ce fil .

C'est celui de "epigrogru" ?
Le tien il doit pas manquer grand chose mais je vois pas malgré vos remarques.

-edit-
Vala ou j'en suis :
Code:
 
/*ALGO RECONSTITUTION LINEAIRE */
#include <stdio.h>
#include <string.h> /* Opérations sur les chaines de caracteres */


int main(){
FILE *fichier;
char string_to_read;
char tab[50];
int size, i;

fichier = fopen("debit.txt", "r" );
size=11;

if (fichier==NULL)
{
printf("Erreur d'ouverture du fichier");
}
else 
{
printf("Le fichier est ouvert\n");
}
/* verification si le fichier est bien ouvert */

while(string_to_read = fgets (string_to_read, size, fichier) != EOF )
{
tab[i] = strdup(string_to_read);
i++;
}
/* Lecture du fichier ligne par ligne */

for (i=0; i<50; i++)
{
printf("%c", tab[i]);
}


fclose(fichier);
// Fermeture du fichier
return 0;	
}
Quelques remarques :
  1. Tu dis que tu as des chiffres dans ton fichier, or tu utilises un tableau de chaîne de caractères. Intérêt ? Zéro. Utilises plutôt un tableau d'int, et utilises la fonction atoi() plutôt que strdup (qui accessoirement est une fuite mémoire, puisque tu ne libères pas les chaînes allouées)
  2. Ton code n'est absolument pas protégé. Que ce soit dans un contexte d'études ou pire professionnel, c'est la dernière connerie à faire. Oui, ton fichier, est censé faire 100 lignes de 10 caractères maximum. Et le jour où ce n'est pas le cas ? Core (quasi) assuré. Je t'accorde cependant que si tu veux vraiment blinder ton programme, le code va commencer à se compliquer ; donc, si tu débutes, laisses ça de côté pour le moment. C'est néanmoins une excellente habitude à prendre que de vérifier le comportement de son programme dans des conditions anormales (qui finissent toujours pas se produire, y compris les cas "impossibles")
  3. Jamais, JAMAIS de constante en dur dans le code (ton tab[50] - d'ailleurs ton fichier n'est pas censé faire 100 lignes ? Non parce que là, au dessus de 50, 99% de chances de plantage, et ton size=11). Utilises un #define SIZE 11 ou mieux const int size = 11;
  4. Je crains fort que tu n'obtienne pas vraiment ce que tu veux avec ce code. Normalement (je ne l'ai pas essayé), il ne doit pas planter, mais afficher n'importe quoi. La raison est simple : tu essaies d'afficher des caractères, alors que tu lui donnes une chaîne de caractères, donc un pointeur.
    Si vraiment tu tiens à passer par des chaînes, utilises plutôt :
    printf("%s\n", tab[i]);
    Si cette remarque, c'est du charabia pour toi, je te conseille de te procurer le Kernighan et Ritchie, et ne de plus toucher une seule ligne de C avant d'avoir parfaitement compris le chapitre sur les pointeurs et les chaînes de caractères (en fait, l'intégralité du bouquin serait préférable).
  5. Remarque personnelle : en général, les commentaires, on les met avant le code, pas après. C'est bien la première fois que je vois ça
Citation :
Publié par TheTralalaTouch
ben si vous etes pas comptant avec la complexité du C et son manque de librairies / fonctions standards autre, si vous voulez lire un fichier, le mieu est quand meme de faire un parser avec lex & yacc
Sauvage
héhé, non c'est beau la complexité c'est beau. après si en C ils faut 200 ligne pour faire un programme sécurisé alors qu'avec un basic/pascal on fait ca en 50 ligne avec le même degré de sécurité. ca laisse quand même perplexe.

je pense qu'il y a ce niveau un autre aspect qui est :

mon langage est-il fait pour ce que je veut faire ? (du moins ce genre de question)
apprendre un langage c'est aussi ca en faite, c'est pas que connaître ca syntax c'est connaître son domaine d'application.
je me permet de répondre a la liste plus haut...sur ce que je sait.

1) astuce toute conne permettant de vérifié que la lecture se fasse, se genre de vérification est évida ment effacer dans le programme final. elle n'arrivait pas a faire sa lecture je comprend tous a fait qu'elle renvoyer des CHAR ascii afin de vérifier sa lecture.
pour moi c'est du debuging.

2) hum...je dirait qu'on ma appris a remplir une BDD quand on est incertain de la longueur que prendra son fichier. donc remarque très judicieuse. Mais ! (voir a a la fin du post)
par contre sans connaître les besoins comment parler de sécurité. si la Mertyl fait des faute de syntax, la remarque 2) est une flagrante erreur d'analyse et oui !

3) oui

4)je trouve qu'on a revient au besoin analytique tes SI le prouve, tu n'est pas apte a analyser ses besoins, on est mieux servie en demandant quand faisant des hypothèses douteuse.

exemple [étude client]:
Mertyl fait tu ce programme pour :
t'amuser ?
dans un but d'apprentissage ?
dans un but professionnel ?
afin de rendre service a une personne qui te la demander ?
(on peut imaginer toute sorte de question...)


donc voila vos commentaires du style moi je me la pet, t'es un noob en C, tu fait n'importe quoi son vraiment a jeter a la poubelle (win) surtout au vu de vos commentaire, de quel droit vous ditent a Mertyl de ce remballer sur des livre alors que vous juger le pourquoi de son programme sans lui avoir poser aucune question d'étude de cas ?

si elle est bonne pour retourner a lire a un livre vous l'êtes tous autant pour aller apprendre une méthode d'analyse (Mersie/uml/sequoia..etc). vous serez peut être apte a poser des questions avant de tirer des conclusions...

sans offenser personne la remarque c'est pas sécuriser ca revient a dire que mon
PRINT Heloo World !
n'est pas sécuriser, et montre une personne qui est a 100 lieu de définir les besoins/ le contexte du programme.

bref MDR, j'ai envie de dire :
@ Mertyl continue, c'est bien.

@ arkiel c'est bien aussi tu essayer de l'aider mais la on voi que l'analyse te manque a toi aussi :
Citation :
Tu devrais d'abord apprendre la syntaxe basique du C avant d'essayer de te lancer dans des projets
pose lui des questions avant d'en arriver la la lecture d'1 ficher s'assimile plus a un exercice qu'un projet qui va couler nintendo.
bref attends de savoir ci ce code c'est réellement pour un projet. bref source ?

@ Lwevin Myan tu a raison sur certains point technique, reste que :
tu t'est renseigner sur le degré de sécurité requis pour le projet de Mertyl ?
Mertyl dit savoir la limite de son fichier, tu a analyser son besoin pour la contredire ?

PS:vraiment mon message peut paraître, insultant mais c'est pas le cas du tout, vous m'avait fait je doit dire bien rire.
Euh Jorimad, il veut apprendre, on le sait.
Si il n'a pas compris la base (il melange pointeur, char, et a du mal avec un simple man) ca ne sert a rien de faire des algo compliques.
Son jet initial n'est meme pas bon a debugger, il est tout faux.

Et j'ai rien compris a ce que tu voulais dire mais je connais aussi et utilise regulierement des methodes d'analyse

Et pis qui aime bien chatie bien
Nan serieux, faut pas griller les etapes. Mertyl manque d'experience. Apparement il suit son livre, chose qui parait evidente lors d'un apprentissage seul (chose qui n'est pas aisee je le felicite). Mais dans un livre une nouvelle chose = un exemple. Or un exemple ne suffit pas.

Si tu veux on peut te filer des projets ou tu auras a manipuler a mort tout ce que tu es sensé connaitre, mais la t'es largué. dsl.
donc oui tu assimile bien sa demande a un exercice de base, ce qui parait le plus logique.

les commentaire qu'il(elle ?) lui disent "d'arrêter de coder en C viennent tout deux :

d'une personne qui définit son exercice comme un projet.
d'une autre qui lui explique que son code n'est pas sécuriser.( et la franchement sans avoir analyser les besoins de l'auteur du code c'est plutot fort non ? ou alors c'est une voyante. )

donc oui, ma remarque se veut plus humoristique qu'autre chose, si le posteur n'a plus qu'a reprendre ses cours la réciproque est vrai pour les deux personne qui lui disent de les reprendre au vu de leur analyse de cet "exercice".

est donc oui c'est qui me met en rogne c'est que non seulement leur argumentation est fausse, et qu'il ne lui pose aucune question sur le contexte de son "exercice".

un question toute bête même sans avoir fait d'analyse :

est-ce un exercice ?
poste nous aussi l'intitulé de l'exercice SVP.

la après oui les réponse pourrait être argumenter aussi quoi.

sans doute du a la communication sur forum mais bon

pis je veut pas étaler ma science, je me prend pas non plus pour un dieu de l'informatique loin de la, pour moi les différentes méthodes d'analyse qu'on peut avoir a la conception d'un code sont encore très récente, surtout dans le domaine de l'enseignement informatique mais ca m'a sauter au yeux stout.

si le posteur ne fait pas d'effort c'est peut être aussi parce qu'on ne lui pose pas les bonnes questions ?

voila ma démarche.
Apparement, Mertyl veut juste que ça marche . Moi je lui conseillerai de sauter cette étape, et de chercher a faire quelque chose de plus simple s'il cherche à apprendre. Il ne faut pas mettre la charrue avant les boeufs .
Citation :
Publié par Jorimad
@ arkiel c'est bien aussi tu essayer de l'aider mais la on voi que l'analyse te manque a toi aussi :
pose lui des questions avant d'en arriver la la lecture d'1 ficher s'assimile plus a un exercice qu'un projet qui va couler nintendo.
bref attends de savoir ci ce code c'est réellement pour un projet. bref source ?
Source son post sur la réalisation d'un jeu de Puissance 4 en C ?
kikoo, je te souhaite la bienvenue sur le laboratoire. Tu as le droit de te renseigner avant de poster.

Sinon, la protection dont parle Lwevyn Myan, c'est contre les segfault, pas contre les méchant hackers.

Et personne ne dit que mertyl a tort d'appendre ce langage, juste qu'il essaie d'aller trop vite.
Je suis tout à fait d'accord sur le fait que mon code est imbuvable et pourtant c'est une fonction readline.
Concernant Mertyl et son apprentissage du C, il est clair qu'il veut aller trop vite et celà risque de lui porter préjudice. En effet, le C est un langage de bas niveau, qui dit bas niveau sous-entend manipulation de la mémoire et les chaines de caractères eh bien c'est de la manipulation de pointeurs. Et les pointeurs? C'est, pour faire simple, une variable qui contient une l'adresse d'une autre. Ma remarque n'a pas pour but de lancer des émeutes, mais Mertyl, que veux tu vraiment faire ?
Apprendre le C ou alors apprendre la programmation ?
Dans le cas ou tu est très motivé tu peux apprendre à programmer en commencant par le C, mais celà suppose de la patience et de l'acharnement car le C manipule la mémoire directement.
Dans le cas ou tu veux juste apprendre à programmer simplement, tu peux essayer le C#, c'est un langage beaucoup plus simple à appréhender que le C.
Et dans le cas ou tu veux juste apprendre le C et que tu as des notions en programmation eh bien prend ton courage à deux mains et pratique.

Maintenant dans le cas de l'apprentisage du C, avant de lire un fichier essaye les exercices suivant :
my_putchar : programme qui affiche un caractères à l'écran ( prototype de la fonction my_putchar(char c))
my_putstr : programme qui affiche une chaine de caractères à l'écran -> my_putstr(char *str)
my_putnbr() : programme qui affiche un nombre à l'écran -> my_putnbr(int nb)
Dès que tu aura correctement fait tout celà tu sera déjà plus familier avec les chaines de caractères et les pointeurs, mais ca ne sera biensur qu'un début.
Fil fermé

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés