Avant tout, désole pour les accents (sauf ceux repris par la correction orthographique) mais je suis sur qwerty ...
Bon voici mon problème :
Je lis un fichier qui contient plusieurs ligne de texte ...
Pour cela :
read(fd, buffer, 1)
J'effectue donc une lecture caractère par caractère que je stock dans le buffer...
Âpres cela je veux stocker ces lignes dans une belle chaîne de caractère char **tabl :
Pour cela :
int my_open_file(char *argv, char *buffer, int fd, int argc)
{
int x;
int y;
int reader;
char **tabl;
x = 0;
y = 0;
reader = 1;
fd = open(fichier, O_RDONLY);
while (reader == 1)
{
reader = read(fd, buffer, 1);
buffer[reader] = '\0';
if (buffer[1] = '\n')
{
y = y + 1;
x = 0;
}
alloc_new_tabl(tabl, buffer, x, y);
x = x + 1;
my_putstr("O.K \n");
//my_putstr(buffer);
//my_putstr(tabl[0]);
}
close(fd)
}
Puis j'appel alloc_new_tabl :
void alloc_new_tabl(char **tabl, char *buffer, int x, int y)
{
tabl[y][x] = malloc(1);
tabl[y][x] = buffer[1];
}
Seg Fault juste après le malloc ...
Le problème vient donc de la mais je n'arrive pas a le régler (sûrement par manque de connaissances ...)
Bref pouvez vous me corriger et m'expliquer pourquoi mon allocation dynamique n'est pas correct.
Plusieurs choses à dire sur ton code.
Je vais essayer de rester simple pour ne pas te perdre.
1) Ta condition est toujours vrai tel que tu l'as ecrit :
if (buffer[1] = '\n')
Il manque un '=' pour effectuer la comparaison. D'autre part tu effectues une lecture caractère par caractère, mais pourtant tu oses ecrire buffer[1]... Vu ton code, buffer[1] devrais toujours valoir 0 qui marque la fin d'une chaine.
2) Ta boucle while ce base sur un nombre d'octet lus ce qui n'est pas correcte. Utilise feof a la place : while(!feof(fd)){...}
3) La lecture caractère par caractère va te bouffer les perfoamance. Il vaut mieux utiliser une lecture par bloc. Mais ce point la n'est pas critique, il n'empeche pas le bon fonctionnement du programme.
4) Ton tableau a deux dimensions. Avant de l'utiliser tu dois allouer la premiere dimensions sans quoi ttu va te prendre des erreurs dans tous les sens. Cela implique que tu dois connaitre a l'avance le nombre de ligne de ton fichier. Si ce n'est pas le cas tu peux toujours initialiser ta zone mémoire par bloc, et la redimenssioner si tu as besoin de plus d'espace.
char ** myArray;
malloc(*myArray, 2); //Initialise le nombre de ligne a 2
malloc(myArray[0], 15); // Initialise la premiere ligne a 15 caractères.
strcpy(myArray[0], "bonjour"); // Affecte une valeur a la premiere ligne
malloc(myArray[1], 15); // Initialise la premiere ligne a 15 caractères.
strcpy(myArray[1], "au revoir"); // Affecte une valeur a la deuxieme ligne
4) Pour rester cohérent avec le reste de ton code utilise la méthode fclose plutot que close pour liberer la mémoire allouer pour ton fichier.
Bref beaucoup de chose à améliorer. Tu peux regarder dans mes sources tu trouveras quelques codes sur la manipulation des fichiers textes en C avec le stockage dans des tableaux.
Alloue la mémoire de ton tableau dans le main(), ca réglera tes problèmes.
Prend l'habitude de ne jamais passer en paramatres un pointeur non initialisé, ca t'évitera d'avoir des surprises.
Tu l'auras remarquer mes mallocs sont faux, mais l'idée est la.
Voici un petit code rapide qui va peut etre mieux t'aider a comprendre les tableaux a deux dimensions :
Alors mes problèmes sont règles mais il me reste un petit problème d'affichage, explication :
Voila mon code fini ...
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h
void my_putchar(char c)
{
write(1, &c, 1);
}
int check(int fd, char *argv, int argc)
{
if (argc != 2)
{
my_putchar('\n');
my_putstr("Attention: Il y a trop de parametres !\n");
my_putchar('\n');
return (0);
}
if (fd == -1)
{
my_putchar('\n');
my_putstr("Erreur: Le fichier d'entree n'a pas ete trouve !\n");
my_putchar('\n');
return (0);
}
else
return (1);
}
void aff_string(char **tabl)
{
int i;
int j;
i = 0;
while (tabl[i] != '\0')
{
j = 0;
while (tabl[i][j] != '\0')
{
my_putchar(tabl[i][j]);
j = j + 1;
}
i = i + 1;
}
}
int my_open_file(char *argv, char **tabl, int fd, int argc)
{
int x;
int y;
int reader;
char *buffer;
x = 0;
y = 0;
reader = 1;
fd = open(argv, O_RDONLY);
if (check(fd, argv, argc) == 0)
return (-1);
buffer = malloc(1 * sizeof(*buffer));
read(fd, buffer, 2);
tabl = (char**)malloc(buffer[0]);
tabl[y] = (char*)malloc(64);
while (reader == 1)
{
reader = read(fd, buffer, 1);
buffer[reader] = '\0';
if (buffer[0] == '\n')
{
y = y + 1;
tabl[y] = (char*)malloc(64);
x = 0;
}
tabl[y][x] = buffer[0];
x = x + 1;
}
aff_string(tabl);
free(buffer);
close(fd);
}
int main(int argc, char **argv)
{
char **tabl;
int fd;
int tmp;
tmp = my_open_file(argv[1], tabl, fd, argc);
if (tmp == -1)
return (-1);
//aff_string(tabl);
}
Mon problème est le suivant:
Âpres avoir traite mon tableau (char **tabl), je l'affiche a la fin de la fonction my_open_file ... Jusque la tout va bien ...
Mais comme je dois utiliser ce tableau dans la suite de mon programme, je re-test son affichage directement dans mon main et la : ERREUR !
Je réalise aucune action sur le **tabl mais il ne s'affiche qu a partir de la fonction my_open_file ...
HELP :(
Merci...
....:::: Tom JOSEPH ::::....
Epitech Toulouse - Tek1
M.S.P. : Microsoft Student Partner