salut,
Je cherche un code en C qui me permette d'ouvrir un fichier en accés séquentiel, de lire ligne à ligne et dès que je trouve une instruction \n, d'insérer la ligne précédente dans une table (base de données ORACLE).
Si quelqu'un a une piste
salut,
Je cherche un code en C qui me permette d'ouvrir un fichier en accés séquentiel, de lire ligne à ligne et dès que je trouve une instruction \n, d'insérer la ligne précédente dans une table (base de données ORACLE).
Si quelqu'un a une piste
Bref, tu veux dire, insérer chaque ligne du fichier dans la base ?
Je ne pourrais t'aider pour le code d'insertion en base, mais j'ai une question pour les lignes:
Est-ce qu'elles ont une taille maximum ?
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Dans ce cas, la partie "lecture des lignes" est plutôt facile: Il suffit de lire les lignes avec fgets()...
Un code de ce genre (attention, je n'ai pas testé) devrait faire l'affaire...
Code C : 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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 /* Retourne 0 si OK, -1 si erreur. */ int EnvoyerLigneEnBase(char const * ligne) { /* ... */ } /* Retourne 0 si OK, -1 si erreur. */ int LireFichierOuvert(FILE *pIn) { char buf[90]; /* fgets() retourne NULL en cas d'erreur */ while(fgets(buf, 90, pIn) != NULL) { /* Ici, buf contient une ligne terminée par un \n */ /* Suppression du \n (enfin, si tu veux) */ char * pLF = strchr(buf, '\n'); if(pLF != NULL) { /* \n trouvé: Tronque la chaîne juste avant */ *pLF = '\0'; } else if(strlen(buf) == 90-1) { return -1; /* ERREUR: La ligne était trop longue. */ } else { /* Pas de \n mais ligne pas trop longue: Ce doit être la dernière. */ } /* Traitement de la ligne */ if( EnvoyerLigneEnBase(ligne) < 0 ) return -1; } return 0; } /* Retourne 0 si OK, -1 si erreur. */ int LireFichier(char const *nomFich) { FILE * pIn = fopen(nomFich, "r"); int ret = -1; if(pIn != NULL) { puts("Lecture du fichier..."); ret = LireFichierOuvert(pIn); fclose(pIn); } else puts("Echec d'ouverture."); return ret; }
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Merci pour ton aide, mais je suis débutant en C, est-ce que tu pourrais si c'est possible commenter ton code en m'indiquant précisément les opérations décrites.
Merci d'avance
D'accord, je vais commenter un peu plus, vérifier que le code compile et poster la version commentée.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Voici le code commenté. Il compile sans erreurs ni warnings, sauf la variable inutilisée dans la fonction vide.
Note: Ce code n'est pas un programme, puisqu'il n'y a pas de fonction main() : Il s'agit juste de trois fonctions pouvant être utilisées dans ton programme.
Code C : 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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125 /* =============================================================== Inclusions de fichiers d'en-tête de la bibliothèque standard */ #include <stdio.h> /* Fonctions d'entrées/sorties (fichiers etc.) */ #include <string.h> /* Fonctions sur les chaînes de caractères */ /* ========================= Fonctions du programme */ /* -------------------------------------------------- Fonction pour envoyer la ligne en base de données. Il n'y a rien dedans, puisque je ne sais pas comment on fait. Paramètres: ligne : La ligne lue (c'est un pointeur const sur le premier caractère de la ligne) Retourne 0 si OK, -1 si erreur. */ int EnvoyerLigneEnBase(char const * ligne) { /* ... */ return 0; } /* ---------------------------------------------------------------------------- Fonction pour lire sur le fichier ouvert. La fonction lit chaque ligne du fichier pour son buffer de 90 caractères. Ensuite, elle cherche le caractère de retour à la ligne dedans, le supprime s'il est là (si les lignes sont bien limitées à 86 caractères, il sera forcément là, sauf pour la dernière ligne) puis appelle la fonction EnvoyerLigneEnBase() sur la ligne lue. Paramètres: pFichierIn : Le fichier ouvert (c'est un FILE*, on n'a pas besoin de savoir ce qu'il y a dedans) Retourne 0 si OK, -1 si erreur. */ int LireFichierOuvert(FILE *pFichierIn) { /* Le tableau de 90 caractères: fgets() va y mettre la ligne lue du fichier. */ char bufLigne[90]; /* fgets() est la fonction standard de lecture d'une ligne dans un fichier ouvert. Elle retourne NULL en cas d'erreur. Si elle réussit à lire une ligne complet, le retour à la ligne (\n) sera dedans. Si la ligne est trop grande pour le buffer, elle sera tronquée avant. */ while(fgets(bufLigne, 90, pFichierIn) != NULL) { /* Ici, buf contient une ligne terminée par un \n */ /* Recherche du \n pour le supprimer: strchr() est la fonction standard de recherche d'un caractère dans une chaîne. Elle prend un pointeur de chaîne de caractères et un caractère en paramètre. Elle retourne l'adresse du caractère dans la chaîne, ou NULL si elle ne l'a pas trouvé. */ char * pLF = strchr(bufLigne, '\n'); /* Si on l'a trouvé, on le vire. Sinon, c'est soit une erreur, soit la dernière ligne. */ if(pLF != NULL) { /* \n trouvé: Tronque la chaîne juste avant */ *pLF = '\0'; } else if(strlen(bufLigne) == 90-1) { /* strlen() donne la longueur d'une chaîne de caractère (sans le caractère nul à la fin). Si cette longueur est égale à la taille du buffer moins 1, c'est que le buffer est plein à ras bord. */ return -1; /* ERREUR: La ligne était trop longue. */ } else { /* Pas de \n mais ligne pas trop longue: Ce doit être la dernière. */ /* On ne fait rien ici. */ } /* Traitement de la ligne */ if( EnvoyerLigneEnBase(bufLigne) < 0 ) return -1; } return 0; } /* ---------------------------------------------------------------------------- Fonction pour ouvrir un fichier et le lire: Cette fonction ouvre le fichier dont on lui passe le nom, elle obtient alors un pointeur de fichier ouvert. Alors elle appelle la fonciton LireFichierOuvert() sur ce pointeur. Paramètres: nomFich: Nom du fichier à lire (c'est en fait un pointeur sur le premier caractère du nom) Retourne 0 si OK, -1 si erreur. */ int LireFichier(char const *nomFich) { /* Valeur qui sera retournée par la fonction. Si l'ouverture échoue, elle restera à -1 (erreur). */ int ret = -1; /* Variable qui contiendra le pointeur de fichier ouvert, retourné par fopen() */ FILE * pFichier = NULL; /* fopen() est la fonction standard pour ouvrir un fichier. Elle retourne un pointeur de fichier ouvert, ou NULL si l'ouverture échoue. */ pFichier = fopen(nomFich, "r"); if(pFichier != NULL) { /* Le pointeur n'est pas NULL, l'ouverture a donc réussi. */ /* puts() : Une fonction standard toute bète pour afficher un message. */ puts("Lecture du fichier..."); ret = LireFichierOuvert(pFichier); /* fclose() : Fonction pour fermer un fichier ouvert. Il ne faut pas l'utiliser si le pointeur est NULL. */ fclose(pFichier); } else { /* Le pointeur est NULL, l'ouverture a échoué. */ puts("Echec d'ouverture."); } return ret; }
J'ignore comment tu veux utiliser ces fonctions, mais le moyen le plus simple, c'est un main() contenant juste un appel à la fonction avec le chemin absolu de ton fichier (on peut faire plus pratique ensuite).
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 int main(void) { LireFichier("C:\\UnDossier\\UnFichier.txt"); return 0; }
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Partager