IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Lire des caractères spéciaux dans un fichier


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2013
    Messages : 35
    Points : 5
    Points
    5
    Par défaut Lire des caractères spéciaux dans un fichier
    bonjour a tous ,
    voila je dois lire ceci :" a  Ò •n}ã ø궫—…—"
    le probleme c 'est qu'avec ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    fichier1=fopen(path1,"rb");
    fgets(chaine1,sizeof(chaine1),fichier1);
    fclose(fichier1);
    j'ai mis rb mais ca refuse de lire ces symboles , savez vous comment faire?
    merci d'avance

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    fgets() lit du texte. Il faut utiliser fread() pour lire du binaire.

    Ou alors ce tourner vers de wchar_t pour ne pas lire du simple ASCII. Exemple.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2013
    Messages : 35
    Points : 5
    Points
    5
    Par défaut probleme avec fread
    voila j'ai essayé ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    fichier1=fopen(path1,"rb");
    fread(&chaine1,sizeof(chaine1),1000,fichier1);
    fclose(fichier1);
    cout<<chaine1<<endl;
    mais ca marche pas non plus ,j'ai peut etre fait une erreur mais sur internet j'ai lu ceci plus ou moins :s ? et ca ne lis plus le texte :"salut ca va "

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    • On ne connait pas la déclaration / définition de ton buffer, on ne peut pas savoir si tu lis correctement.
    • Tu mélanges des fonctions normalement utilisées uniquement en C avec des opérateurs purement C++. Bien que ces fonctions soient correctes en C++, elles sont à ma connaissance peu utilisées. Pourquoi faire cette "mixture" de C et de C++ ?
    • Tu lis du binaire et tu veux afficher du texte, ça ne me semble pas cohérent.
    • Tu n'as jamais parlé d'un texte "salut ca va", que vient-il faire là ?


    Plus globalement, il serait temps de nous expliquer ce que tu veux vraiment faire pour qu'on te donne une vraie réponse

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2013
    Messages : 35
    Points : 5
    Points
    5
    Par défaut
    alors concretement : je dois lire un fichier tel que:
    "voici le code :ø궫—…—"
    donc ca melange du texte et en meme temps d'étrange symbole .
    je veux mettre ca dans une chaine de caractere tel que:
    et ensuite me l'envoyer en mysql , mais chaine1 ne veut pas contenir :"voici le code :ø궫—…—"

    voila mon probleme

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Si tu avais lu de manière attentive mon premier message, tu aurais sans doute suivi mon lien et trouvé une solution adaptée... Mais comme tu marques que tu es lycéen, je vais mettre ça sur le compte de la découverte du C

    Les char ne permettent pas de stocker (beaucoup) de caractères spéciaux car ils utilisent l'encodage ASCII, il faut utiliser des wchar_t pour cela (ils sont apparus avec le C99). Et il faut créer un fichier encodé en UTF-8 et non en ASCII.

    Autre problème : ta console ne sera sûrement pas capable d'imprimer correctement des caractères non ASCII. C'est en tout cas le cas avec mon Windows 7. Il y a sans doute une manip pour cela.

    Pour vérifier que la lecture marche si on a la flemme de changer le terminal, l'idée est donc de réécrire dans un fichier pour voir que tu as la même chose qu'au début.

    Exemple de code :
    Code : 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
    #include <errno.h>
    #include <locale.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <wchar.h>
     
    int main(void) {
        errno = 0;
     
        wchar_t string[100];
        setlocale(LC_ALL, "");
     
        FILE * pfile = fopen("data.txt", "r");
        if(pfile == NULL)
        {
            perror("fopen data.txt");
            exit(EXIT_FAILURE);
        }
     
        fgetws(string, sizeof(string) / sizeof(string[0]), pfile); // might fail
        fclose(pfile);
     
        printf("String Entered: [%ls]: length: %d", string, wcslen(string)); // prints bad because CMD is not prepared for UTF-8
     
        pfile = fopen("copy.txt", "w");
        if(pfile == NULL)
        {
            perror("fopen copy.txt");
            exit(EXIT_FAILURE);
        }
     
        fprintf(pfile, "String Entered: [%ls]: length: %d", string, wcslen(string));
        fclose(pfile);
     
        return 0;
    }
    Il faudra faire attention lors de l'interfaçage avec MySQL pour les encodages (encore une fois...) mais mes compétences ne vont pas jusque là.

    PS : les fonctions utilisant des char ont leurs équivalents avec des wchar_t ou alors des formatteurs adaptés pour les fonctions comme printf() et son %ls. Voir par exemple pour fgets() : http://msdn.microsoft.com/en-us/library/c37dh6kf.aspx

  7. #7
    Membre averti
    Homme Profil pro
    Cadre informatique
    Inscrit en
    Avril 2013
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Cadre informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 183
    Points : 435
    Points
    435
    Par défaut
    Salut!

    Ton problème se ramène à gérer des caractères spéciaux codés dans un genre un peu embêtant qui, pour un néophyte, entraine la réaction suivante:

    En fait, un caractère spécial se résume juste en une séquence de bit que l'ordinateur reconnaît. Si il te les affiche c'est qu'il connait ce codage.
    Il suffit de faire le chemin inverse

    Si tu utilises ce site, tu auras une translation entre un codage (déjà existant) de tous les caractères spéciaux que tu as mentionné.

    Ensuite, existe-t'il une bibli qui fait déjà ça ou dois-tu le faire à la main, je ne peux t'en dire plus ^^

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2013
    Messages : 35
    Points : 5
    Points
    5
    Par défaut
    c'est compliqué
    j'ai fait ce code ci dessous mais ca ne marche pas
    Code : 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
     
     
    #include <iostream>
    #include <locale.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <wchar.h>
    using namespace std;
    int main(void) {
     
    wchar_t chaine[10000];
    FILE*code;
    code=fopen("C:\\Users\\pac\\desktop\\coco.txt","rb");
    fgetws(chaine,10000,code);
    cout<<chaine<<endl;
    }
    il ne veut pas lire "voici le code :ø궫—…—"
    avez vous un exemple pour mon cas svp ?

  9. #9
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Deja est que tu lis les réponses qu'on te donne ?
    Bktero t'avait demandé pourquoi ce mélange de C /C++ .
    Deuxièmement on te l'a déjà dit mais je le répète la console n'affiche pas les caractères spéciaux , si tu veux vérifier que tu as bien lu correctement ton fichier soit tu affiche chaque caractère en valeur décimal/hexadécimale soit tu fait qql if pour vérifier si tu as les bonnes valeurs (mais faudra un éditeur hexadécimal pour vérifier si y a la lecture a été correct).

    Code : 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
     
     
    #include <iostream>
    #include <locale.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <wchar.h>
    using namespace std;
    int main(void) {
     
    wchar_t chaine[10000];
    FILE*code;
    code=fopen("C:\\Users\\pac\\desktop\\coco.txt","rb");
    fgetws(chaine,10000,code);
    cout<<chaine<<endl;
    }
    Ce code n'est pas du C mais pas non plus du C++ (correct)
    En C++ en utilise ifstream ,donc décide toi dans quel langage tu veux le faire (surtout que ton code compile en C++ et pas en C et justement tu est dans le forum C pas C++), le deuxième point , y a pas indentation , et ça faudra le faire , c'est comme le français t'écris une rédaction sans virgule , sans point , sans majuscule ect ? non en prog c'est pareil.

    avez vous un exemple pour mon cas svp ?
    Non mais utilise fread comme on te l'as conseillé.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2013
    Messages : 35
    Points : 5
    Points
    5
    Par défaut
    oui je lis vos reponses , j'ai appris le c et le c++ vite fait pour etre honnête et j’apprends en m'exercant , donc je melange sans doute les deux car mon niveau est debutant mais ca ne pose pas de probleme a ce que je vois car on peut utiliser les deux ?
    ensuite la console je m'en fous enfaite je veux mettre tout ca dans une chaine de caractere et ensuite envoyer la chaine par mysql,
    mais le probleme et quand j'envoie la chaine elle ne lit que le texte et pas les symboles etranges
    j'ai essayé avec fread mais ca ne marche pas non plus quand je regarde dans ma BDD

  11. #11
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    mais ca ne pose pas de probleme a ce que je vois car on peut utiliser les deux ?
    Oui en C++ , et ou tu te trouve dans le forum C. , sauf si un modo déplace ta discussion dans le forum C++ , mais la aussi je doute que les prog C++ apprécie ta façon de codé
    Donc ton code ne compile pas en C mais oui en C++ (mais ce n'est pas du code correct en C++).

    Après je viens de remarqué que tu n'as pas fait de fclose , et tu ne verifie pas si ouverture tu fichier a été faire.
    Montre nous ton code en utilisant fread et ton code mysql sinon je vois pas comment on peut t’aidai.

  12. #12
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Kannagi
    Deja est que tu lis les réponses qu'on te donne ?
    Oh ! Merci !

    Je n'ai rien à rajouter.

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2013
    Messages : 35
    Points : 5
    Points
    5
    Par défaut
    voici mon code:
    Code : 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
     
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <dirent.h>
    #include <string.h>
    #include <fstream>
    #include <windows.h>
    #include <time.h>
    #include <winsock.h>
    #include <mysql.h>
    #include <MYSQL/mysql.h>
    using namespace std;
    int main(){
    char chaine1[1000000];
    char requete[500];
    FILE *fichier1;
     
     
    fichier1=fopen("C:\\Users\\user\\Desktop\\coco.txt","rb");
    fread(&chaine1,sizeof(chaine1),1000000,fichier1);
    fclose(fichier1);
     
    MYSQL mysql;
    mysql_init(&mysql);
    mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"option");
    if(mysql_real_connect(&mysql,"mysql2.alwaysdata.com","***","***","****",3306,NULL,0))//***j'ai caché :)
        {
    sprintf(requete, "INSERT INTO jeu VALUES('', '%s')",chaine1);
    mysql_query(&mysql, requete);
        }
    mysql_close(&mysql);}

  14. #14
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Moi tu vois , je crois pas que tu lis les réponses qu'on te donne , d'ailleurs ça sera ma dernière intervention ici vu que je parle a un mur ...
    N’espère pas qu'on te file un code tous fait

    ALors je répète tu fais tu C++ ok compris ?
    Et ici c'est le forum C.

    Le deuxième point indentation , j'avais un prof qui refusait les codes qui n'était pas incrémentait , la pareille pas envie de le corrigeait, même si ton code est compréhensible (pour le moment ).

    Sinon voici ma réponce :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fread(&chaine1,sizeof(chaine1),1000000,fichier1);
    je doute que ton fichier fait 1000000 octet , utilise fseek pour connaitre la taille de ton fichier (ou Google pour te renseigné a son utilisation).
    Je connais pas mysql mais fread si je me trompe pas ne termine pas le caractère pas '\0' et comme tu fais un sprintf il lira jusqu’à il rencontre un '\0' sans parler que ça peut creer un segfault.

    Donc relis les cours sur les chaine de caractères et la lecture de fichiers après tu reviendra mettre ton code en C ,incrémentais et j’espère un peu plus correct.
    Tu peux le continuer a le faire en C++ , la faudra poster sur le forum C++.

  15. #15
    Membre régulier Avatar de Mipwiq
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 42
    Points : 81
    Points
    81
    Par défaut
    Le deuxième point incrémentation , j'avais un prof qui refusait les codes qui n'était pas incrémentait , la pareille pas envie de le corrigeait, même si ton code est compréhensible (pour le moment ).
    Heuuu, je pense que ce dont tu parles est plus l'indentation que l'incrémentation non ?
    Et la différence entre l'imparfait et un participe passé est assez importante pour être faite

  16. #16
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    oui tu as raison c'est mélangé les mots ,j'ai corrigé

  17. #17
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Autre problème : ta console ne sera sûrement pas capable d'imprimer correctement des caractères non ASCII. C'est en tout cas le cas avec mon Windows 7. Il y a sans doute une manip pour cela.
    N'est-ce pas à ceci que tu penses ?
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  18. #18
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    En fait je ne pensais pas à grand chose mais ça répond au problème

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/09/2010, 10h01
  2. [MySQL] Gestion des caractères spéciaux dans un update
    Par olivier94 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 01/03/2007, 17h13
  3. [C#] Caractères spéciaux dans un fichier
    Par KibitO dans le forum C#
    Réponses: 7
    Dernier message: 04/01/2007, 09h16
  4. Réponses: 15
    Dernier message: 04/01/2007, 08h47
  5. Réponses: 10
    Dernier message: 31/03/2006, 20h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo