[encodage] Lecture/écriture dans des fichiers
Bonjour à tous,
Actuellement j'ai mis au point un programme qui me permet de colorier mon code afin de l'afficher sur une page web (pour un petit exemple, voir sur http://spootnikdev.dyndns.org/progra...c=AGLContext.c (c'est un site perso hébergé sur mon Mac que je laisse à disposition de 9h à 22h minimum ->heure de France)). Pour la 1e version de ce logiciel, j'ai utilisé une bibliothèque sépcifique à mon système (Mac OS X) et qui gère donc elle-même l'encodage.
Je cherche maintenant à obtenir le même programme, mais cette fois ci en utilisant des fichiers d'en-tête génériques (stdlib.h, stdio.h et string.h).
J'ai donc adapté mon code à ces "headers". Le programme fonctionne sans erreur apparente, mais lorsque je regarde le fichier coloré (en HTML), j'obtiens plein de symboles étranges, alors que d'autres parties apparaissent clairement.
Citation:
cÿýèoÿýèmÿýèpÿýèlÿýèeÿýètÿýèeÿýèlÿýèyÿýèd.\n");
break;
}
break;
Je pense que le problème vient de mes méthodes d'écriture/lecture dans mes fichiers (fichier de code comme source et fichier HTML comme destination).
Mon code n'est peut-être pas très "propre" :mrgreen:
Voici ma méthode de lecture (la fonction strFromStrings() est décrite plus bas) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
#define TAILLE_MAX 4096
char *readFromFile(const char *path){
char *cData = "";
FILE* fichier = NULL;
char chaine[4096] = "";
fichier = fopen(path, "r");
if (fichier != NULL){
while (fgets(chaine, TAILLE_MAX, fichier) != NULL){
cData = strFromStrings(cData, chaine);
}
fclose(fichier);
} else {
return NULL;
}
return cData;
} |
et ma méthode d'écriture :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
unsigned char writeToFile(const char *path, const char *data){
FILE* fichier = NULL;
fichier = fopen(path, "w");
if (fichier != NULL){
unsigned int lgt = strlen(data);
unsigned int i = 0;
for (i = 0;i < lgt;i++){
fputc( data[i], fichier);
}
fclose(fichier);
return 1;
} else {
return NULL;
}
} |
Ma fonction writeToFile() renvoie NULL en cas d'erreur lors de l'écriture.
Mais à part ces méthodes simples de lecture/écriture, je ne sais pas du tout comment gérer l'encodage (si le problème est bien l'encodage). Je sais qu'il existe la bibliothèque libiconv, mais je n'arrive pas du tout à m'en servir.
J'aimerais aussi avoir vos avis sur un nettoyage du code que j'utilise pour assembler des chaines de caractère. Je suis sûr qu'il y a plus propre :mrgreen:
Voici mon code d'assemblage (à la barbare):
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
#include <stdlib.h>
char *strFromStrings(char *str1, char *str2){
unsigned int len1, len2;
len1 = strlen(str1);
len2 = strlen(str2);
char *strCat = malloc(sizeof(char) * (len1 + len2));
unsigned long i = 0;
for(i = 0; i < len1;i++){
strCat[i] = str1[i];
}
for(;i < (len1 + len2);i++){
strCat[i] = str2[i - len1];
}
return strCat;
} |
Pour info, il n'y a eu aucun bug de mémoire lorsque j'ai testé mon programme.
Merci à tous ;)