[C] Lire un fichier ligne par ligne

Fil fermé
Partager Rechercher
Bonjour,
J'aimerais lire un fichier ligne par ligne et que chaque ligne vienne se mettre dans une case d'un tableau. (En C). Le fichier c'est des chiffres, il fait au max 100 lignes de 10 caractéres au maximum.

Pour cela si j'ai bien comprit le mieux est fgets, certes j'ai lu des tutoriaux, demandé sur un forum "dit spécialisé" et j'ai pas réussi a obtenir grand chose.

Voilà 2 codes que j'ai testé et qui ne marche pas tout les deux, si quelqu'un pouvait m'aider ca serait gentil.

Code:
//ALGO RECONSTITUTION LINEAIRE
#include <stdio.h>
#include <string.h> /* Opérations sur les chaines de caracteres */


int main(){

FILE *fichier;
fichier = fopen("debit.txt", "r" );

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

while(char * fgets (char * s, int size, FILE * fichier) !=EOF )
{
printf("WALLAI");
}

fclose(fichier);
// Fermeture du fichier
return 0;	
}
gcc lineaire.c -o fichier -Wall
lineaire.c: Dans la fonction « main »:
lineaire.c:17: error: erreur de syntaxe before "char"
lineaire.c: Hors de toute fonction :
lineaire.c:22: attention : type defaults to `int' in declaration of `fclose'
lineaire.c:22: attention : noms de paramètres (sans type) dans la déclaration de fonction
lineaire.c:22: attention : data definition has no type or storage class
lineaire.c:24: error: erreur de syntaxe before "return"

-Puis :

Code:
//ALGO RECONSTITUTION LINEAIRE
#include <stdio.h>
#include <string.h> /* Opérations sur les chaines de caracteres */


int main(){
int c, i;
char a="", tab[100];


FILE *fichier;
fichier = fopen("debit.txt", "r" );

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

while((c = fgetc(fichier)) !=EOF )
{
   if (c!='\n')
   {
   a = strcat(a,c);
   }
   else
   {
   tab[i] = a;
   a="";
   }
}

fclose(fichier);
// Fermeture du fichier
return 0;   
}
lineaire.c: Dans la fonction « main »:
lineaire.c:8: attention : initialisation transforme un pointeur en entier sans transtypage
lineaire.c:24: attention : passage de l'argument n°1 de « strcat » transforme un entier en pointeur sans transtypage
lineaire.c:24: attention : passage de l'argument n°2 de « strcat » transforme un entier en pointeur sans transtypage
lineaire.c:24: attention : affectation transforme un pointeur en entier sans transtypage
lineaire.c:29: attention : affectation transforme un pointeur en entier sans transtypage


Merci.
Strcat ça revoie quoi ?

Fgetc ça renvoie quoi ?

Une fois que tu auras bien relu ces deux mans : utilise read plutôt que fgetc ou fgets, et réfléchie un peu a ce qui va marquer la fin de chaque ligne, ainsi que la fin de chaque fichier.

ps : les // c'est pour commenter en C++, en C on utilise /*commentaire*/ . Si jamais tu recompile tes programmes avec -ansi ca risque de peter.
Message supprimé par son auteur.
Citation :
Publié par Fable
Strcat ça revoie quoi ?

Fgetc ça renvoie quoi ?

Une fois que tu auras bien relu ces deux mans : utilise read plutôt que fgetc ou fgets, et réfléchie un peu a ce qui va marquer la fin de chaque ligne, ainsi que la fin de chaque fichier.

ps : les // c'est pour commenter en C++, en C on utilise /*commentaire*/ . Si jamais tu recompile tes programmes avec -ansi ca risque de peter.

-Un pointeur
-Une chaîne de caractére

Pour read j'ai lu ca sur mon livre de C et apparemment c'est mieux car ca ne passe pas par la mémoire tampon c'est cela ?

A y est j'ai lu les 2 mans et j'ai rien comprit, j'y suis depuis ce matin 9h alors je les est lu assez je pense.

Merci pour les commentaire je croyais que c'était compatible.
Le fonction strcat renvoie un pointeur, oui mais sur quel type ? C'est un pointeur sur char, char * donc.

Quand a fgetc, elle renvoie un int, non pas une chaîne de caractère (au passage : pointeur sur char, char *, chaîne de caractère, string --> on parle toujours de la même chose hein : un char * dans le code). C'est fgets qui renvoie un char * (fgetc = caracter, fgets = string).

Dans le premier code que tu nous montres, on voit un appel de fonction avec son type. Or lors d'appels de fonctions, on ne donne pas son type, pas plus que celui de ses arguments.

Correction de ton premier code :
Code:
/* ALGO RECONSTITUTION LINEAIRE */
#include <stdio.h>
#include <string.h> /* Opérations sur les chaînes de caractères */


int main()
{
FILE *fichier;
char *string_to_read;
int size;

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)
{
printf("WALLAI");
}
fclose(fichier);
/* Fermeture du fichier */
return 0;
}
Voila ton code a peu prêt corrige. Je n'ai pas compile je te laisse tester et comprendre les petites modifications. Au passage aussi j'ai éclairci le code, essaie de faire comme ça a l'avenir ça aidera les corrections potentielles .

Dans le deuxième code, c'est surtout au niveau de la boucle que ça choque.

Voici un rapide topo sur ce qui ne marche pas :
Code:
while((c = fgetc(fichier)) !=EOF )
{
   if (c!='\n')
   {
   a = strcat(a,c);
   }
   else
   {
   tab[i] = a;
   a="";
   }
}
Le programme va donc storer le caractère renvoyer par fgetc dans la variable c, jusqu'à ce qu'il n'y ait plus rien a lire. Soit, pourquoi pas (je ne corrige pas la logique du programme, c'est a toi de le faire ça).
Si ce caractère est '\n' (soit le caractère correspondant a ENTER, ou fin de ligne), alors strcat concatène la chaîne c dans la chaîne a. Ce qui choque, c'est que ni a, ni c ne sont des chaînes de caractères : ce sont des caractères. Impossible que ça compile donc.

Voila c'est a peu près tout pour le moment.
Merci bien, en fait je croyais que chaine de caractères signifié de 1 à x caractères, or apparemment 1 cela commence à 2 si j'ai suivi.

J'avoue ne pas trés bien comprendre ce que tu m'explique mais je vais le relire, merci pour la correction.

"Si ce caractère est '\n' (soit le caractère correspondant a ENTER, ou fin de ligne), alors strcat concatène la chaîne c dans la chaîne a"'

C'est si le caractére N'EST PAS plutot non ?
En fait je voulais stocker chaque ligne dans une case du tableau ici, il n'existe pas de moyen de concaténer 2 carcatéres ?

-EDIT-
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]=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;	
}
Me donne :


lineaire.c:25: attention : comparaison entre un pointeur et un entier
lineaire.c:25: attention : affectation transforme un entier en pointeur sans transtypage
lineaire.c:25: attention : suggest parentheses around assignment used as truth value
lineaire.c:27: attention : affectation transforme un pointeur en entier sans transtypage

puis :

Le fichier est ouvert
Incident de segmentation (core dumped)

Help.


Oui faute de frappe pardon .

Pour concaténer deux caractères, tu déclares deux chaînes dont la mémoire est allouée, et tu rentre chacun de ces caractères dans chacune des chaînes. Ce seront des chaînes de un caractère .

Quand a une chaîne de caractère, en effet le première caractère d'une chaîne est chaîne[0], le second chaîne[1], etc...
Appelle a la reprise de travail de FABLE
Je DENONCE Fable qui passe sont temps a chatter au lieux de faire son travail qui est d ailleur de coder......
le plus drole c est qu il donne des petites lecons
je vous demande a tous de ne plus lui repondre et ainsi lui permetre de travailler et de reussir son annee et ainsi la notre
AIDEZ LE.....
c est pour son bien...
Unhappy
soutenez nous !
Je suis un camarade désespéré de ce bon vieux fable.. Arretez de lui parler, bannissez le.. Svp..
JOL est une drogue pour lui..
Liberez le qu'il s'envole vers un monde de code de 42sh , bien meilleur pour lui..
Je soutien mon chef de projet...
Reviens fable reviens !
Citation :
Publié par Mertyl
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]=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;	
}
Me donne :


lineaire.c:25: attention : comparaison entre un pointeur et un entier
lineaire.c:25: attention : affectation transforme un entier en pointeur sans transtypage
lineaire.c:25: attention : suggest parentheses around assignment used as truth value
lineaire.c:27: attention : affectation transforme un pointeur en entier sans transtypage

puis :

Le fichier est ouvert
Incident de segmentation (core dumped)

Help.



Je bloque encore sur ca. Y'a les erreurs, et le code !
je zieute le man fgets et je te dis ca

Normal que ca marche pas, tu mets la valeur renvoyer par fgets dans string_to_read.
Mais meme c'est du grand nimporte quoi ta fontcion
Code:
while(string_to_read = fgets (string_to_read, size, fichier) != EOF )
{
tab[i]=string_to_read; 
i++;
}
En fait je pige pas, tu veux lire tout ton fichier ou lire une seule ligne ?
Toutes les lignes font la meme taille ou pas ?
fgets revoie une string hein . C'est fgetc qui renvoie un int. Donc c'est tout a fait logique pour ce passage. C'est les parenthèses que j'ai oublie qui font foirer la compile, et la ligne suivante (tab[i] = str_to_read) que tu as ajoute Mertryl .
Ca ca devrait marcher
Code:
#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);
}
Pour l'utiliser faut pas ouvrir un FILE * ave fopen mais un int fd avec open, si tu connais pas chercher man open sur google
Citation :
Publié par Fable
fgets revoie une string hein .
Oui, mais une string de merde, celle qui nous interesse etant stocker dans le buffer qu'on lui file.

Vive open et read de toute facon.
Citation :
Publié par Groinkkk
je zieute le man fgets et je te dis ca

Normal que ca marche pas, tu mets la valeur renvoyer par fgets dans string_to_read.
Mais meme c'est du grand nimporte quoi ta fontcion
Code:
while(string_to_read = fgets (string_to_read, size, fichier) != EOF )
{
tab[i]=string_to_read; 
i++;
}
En fait je pige pas, tu veux lire tout ton fichier ou lire une seule ligne ?
Toutes les lignes font la meme taille ou pas ?
Stocker chaque ligne du fichier dans une variable :

-Tab[0] : "1818187"
-Tab[1] : "44547"

pour le fichier :
1818187
44547

Et non les lignes ne font pas la même taille. (max10)
Si elles font pas la meme taille ca complique serieusement, car la tu lis le meme nombre de caracteres a chaque fois.

Tu as alors 2 choix : soit tu sauvegarde ce qui tu a lu en trop (apres le \n), soit tu te replace au bon endroit dans le fichier (man lseek).

Mais tu as aussi une fonction qui te lis direct un entier.
Le temps de la retrouver.
[Edit] - Ah non javais fais un combo get_next_line()/atoi(), oublie ce que jai dit.

et pour pas segfault, fais un tab[i] = strdup(string_to_read);

[Edit]
Donc choisi si tu prefere te replacer dans le fichier avec lseek() ou gerer un tampon du rab de ligne (plus propre mais plus dur, bcp plus dur)


Et ton tableau c'est un tableau de char la, pas de char *, donc tu peux pas stocker des lignes
Faut corriger ta declaration.

C'est un peu decousu, mais faut dire que ta un peu pas reflechi a ce que tu faisais la
Perso , je t'aurai conseillé de d'abord réaliser ton programme en utilisant les redirections fichiers, histoire d'être sur que tout marche correctement niveau algorithmique, et après seulement d'attaquer la lecture fichier.(et vu que tu as l'air d'avoir quelques difficultés niveau gestion des chaînes de caractères et autre)
Un seuil de difficulté à la fois.
Franchement c'est juste dela lecture de fichier ligne par ligne ca me fait halluciné comment c'est compliqué.

En au3 :

Code:
$FH = FileOpen("nm_dico.txt", 0)
$mot = FileReadLine($FH,$i)
FileClose($FH)
En gros faut rajouter 1 for et ca marche.

Je veux juste lire un fichier et stocker son contenu de chaque ligne dans une variable pas plus.

Jecomprend pas pourquoi c'est si compliqué. :\
A mon humble avis, mertyl, tu mets la charue avant les boeufs. Tu devrais d'abord apprendre la syntaxe basique du C avant d'essayer de te lancer dans des projets, à chacun de tes posts ça devient de plus en plus évident.
Je veux bien comprendre que ce n'est pas quelque chose de passionnant à faire, mais tu saurais résoudre 90% de tes problèmes voir plus si tu connaissais la syntaxe du C et les divers éléments du language.
Citation :
Publié par arkiel
A mon humble avis, mertyl, tu mets la charue avant les boeufs. Tu devrais d'abord apprendre la syntaxe basique du C avant d'essayer de te lancer dans des projets, à chacun de tes posts ça devient de plus en plus évident.
Je veux bien comprendre que ce n'est pas quelque chose de passionnant à faire, mais tu saurais résoudre 90% de tes problèmes voir plus si tu connaissais la syntaxe du C et les divers éléments du language.
je suis tout à fait d'accord, chaque post c'est voilà du code, ça marche pas voilà les erreurs du compilo

il faut d'abord comprendre la syntaxe C, le fait que c'est un langage de bas niveau, et ensuite essayer de comprendre les erreurs. Ensuite tu as d'innombrables ressources disponibles sur le net ( notemment en anglais, langue où l'auteur a quelques problemes je crois ... ) pour approfondir.
Fil fermé

Connectés sur ce fil

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