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 :

[Fichiers] Lire une ligne spécifique dans un (gros) csv


Sujet :

C++

  1. #21
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Par défaut
    okay bon je travaillle sur visual studio..
    Je rajoute les 3 fichiers suivants à mon projet:
    sqlite3.c
    sqlite3.h
    sqlite3ext.h

    J'ai essayé de faire un void main()
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    #include <stdio.h>
    #include "sqlite3.h"
     
    #include <string>
    #include <cstring>
    #include <iostream>
     
    char* stringToCharStar(std::string str)
    {
        using namespace std;
     
        // créer le buffer pour copier la chaîne
        size_t size = str.size() + 1;
        char * buffer = new char[ size ];
        // copier la chaîne
        strncpy( buffer, str.c_str(), size );
        // utiliser le buffer
        return buffer;
    }
     
    static int callback(void *NotUsed, int argc, char **argv, char **azColName){
      int i;
      for(i=0; i<argc; i++){
        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
      }
      printf("\n");
      return 0;
    }
    //int main(int argc, char **argv){
    void main(){
      int argc = 3;
      const char **argv;
      std::string fileName = "vRetEq";
      argv[1] =  stringToCharStar(fileName);
      sqlite3 *db;
      char *zErrMsg = 0;
      int rc;
     
      if( argc!=3 ){
        fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
        //exit(1);
      }
      rc = sqlite3_open(argv[1], &db);
      if( rc ){
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        //exit(1);
      }
      rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
      if( rc!=SQLITE_OK ){
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
      }
      sqlite3_close(db);
      //return 0;
    }
    qui ne fonctionne évidemment pas...
    Bon j'avoue que j'ai (déjà) un peu de mal avec le char** (ouhhh le nul) (ca va ca va)

    help?

  2. #22
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Par défaut
    Run-Time Check Failure #3 - The variable 'argv' is being used without being defined.
    sur la ligne argv[1] = ...

  3. #23
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    humm tu n'alloues pas la memoire ...
    et normalement le argv argc ce sont les arguments de la fonction main...
    (parametre de la ligne de commande)

    en gros enleve les ca sera plus simple.

    par contre moi j'utilise Qt pour l'interface avec SQLite :-)
    mais bon pour faire un insert / exec on devrait pouvoir se debrouiller avec l'api :-)

    edit: enleve aussi ton stringtochar par la meme occasion

  4. #24
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Par défaut
    Citation Envoyé par epsilon68 Voir le message
    humm tu n'alloues pas la memoire ...
    et normalement le argv argc ce sont les arguments de la fonction main...
    (parametre de la ligne de commande)

    en gros enleve les ca sera plus simple.

    par contre moi j'utilise Qt pour l'interface avec SQLite :-)
    mais bon pour faire un insert / exec on devrait pouvoir se debrouiller avec l'api :-)

    edit: enleve aussi ton stringtochar par la meme occasion
    C'est quoi QT

  5. #25
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354

  6. #26
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Par défaut
    et ca sert à quoi...
    enfin je veux dire keske ca peut m'apporter de plus que d'installer seulement sqlite?

  7. #27
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    il n'y a pas de probleme, juste que c'est moi qui n'avait pas l'habitude de voir du code C alors que j'utilise Qt pour manipuler ma database.

    mais c'est bon l'api ca va tres bien aller pour ce que tu veux faire, no problem.
    C'est juste un poil plus compliqué.

  8. #28
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Par défaut
    okay donc je dois pas installer Qt?

  9. #29
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    ... non

  10. #30
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Par défaut
    merci:-)
    J'ai déjà avancé d'un pas :-))

  11. #31
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    n'oublie pas de nous tenir informé, je suis très interessé aux performances dans les cas concrets.

  12. #32
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Par défaut
    okay j'ai juste besoin de pouvoir transformer mon fichier en sqlite

    j'ai vu un truc du genre
    sqlite3 test.db
    sqlite> .mode csv
    sqlite> .import ./TotReturn.csv test

    Ce qui ne marche pas..

  13. #33
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Par défaut
    Voila ce que j'ai essayé
    Visual Studio 2003 : Mode console

    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 <windows.h>
    #include <iostream>
    typedef struct sqlite3 sqlite3;	
    void main(){
    		HINSTANCE proxl_73 = LoadLibrary(TEXT("tclsqlite3")); // on load la DLL
    		if ( proxl_73 == NULL ) 
    			std::cout <<"err";  // on traite l'erreur si ouverture DLL foireuse
     
    		typedef int (__stdcall *sqlite3_open) (const char*, sqlite3**); // on définit le type de la fonction a appeler pour simplifier le code:
    		sqlite3_open sqlOpen = (sqlite3_open)GetProcAddress(proxl_73, "sqlite3_open"); // on récupère un pointeur sur cette fonction
     
    		const char* filename = "test.db";
    		sqlite3** ppdb;
    		int res =sqlOpen(filename,  ppdb);
    }

    Erreur:
    ppdb n'a pas été défini...

    Okay je veux bien la définir mais là je vois vraiment pas..
    Et en plus je sais pas si je suis sur la bonne voie...

  14. #34
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    il faut utiliser sqlite.h
    et je mettrais aussi les sources tant qu'a faire...
    comme t'avais fait au debut, je ne vois pas pourquoi tu as changé

  15. #35
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Par défaut
    Effectivement je sais pa pq j'étais parti dans ce trip dll..
    Bon donc dans mon projet en mode console (VS 2003)
    j'ai les 3 fichiers sqlite3 (.h , .c et ext.h)
    et mon main.cpp
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #include <iostream>
    #include "sqlite3.h"
     
    static int callback(void *NotUsed, int argc, char **argv, char **azColName){
      int i;
      for(i=0; i<argc; i++){
        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
      }
      printf("\n");
      return 0;
    }
     
     
     
    int test(int argc, char **argv){
      sqlite3 *db;
      char *zErrMsg = 0;
      int rc;
     
      if( argc!=3 ){
        fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
        exit(1);
      }
      rc = sqlite3_open(argv[1], &db);
      if( rc ){
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        exit(1);
      }
      rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
      if( rc!=SQLITE_OK ){
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
      }
      sqlite3_close(db);
      return 0;
    }
     
    void main(){
    	char filename[] =  "test.db";
    	char *tmp ;
    	tmp = &filename[0];
    	char **argv;
    	argv = & tmp;
    	int res = test(3, argv);
    }
    Ca compile, mais j'ai une erreur
    Unhandled exception at 0x004cfd07 in sqlite.exe: 0xC0000005: Access violation reading location 0xcccccccc.
    à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rc = sqlite3_open(argv[1], &db);
    QQun peut me dire comment m'en sortir?
    Merci

  16. #36
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    mais tu utilises des variables non allouées.

    pourquoi tu ne mets pas les noms en dure, pourquoi tu t'obstines a utiliser argc argv que tu n'as pas alloué????

  17. #37
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Par défaut
    mais pcq je sais pas quoi mettre...
    Tu peux me donner un petit bout de code qui fonctionne et qui va lire le csv?

    Salut

  18. #38
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char *tmp ;
    tmp = &filename[0];
    char **argv;
    argv = & tmp;
    int res = test(3, argv);
    comment peut tu avoir quelque chose à argv[1] ???????

  19. #39
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Par défaut
    mais je crois que mon problème (ou du moins une partie) vient du char** que j'ai du mal à comprendre et à initialiser

  20. #40
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par dhoorens Voir le message
    mais je crois que mon problème (ou du moins une partie) vient du char** que j'ai du mal à comprendre et à initialiser
    oui d'où ma question.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char **argv;
    argv = & tmp;
    en gros (ce sera plus simple d'expliquer comme cela)
    ici tu initialise ton tableau argv avec un tableau de 1 élément.
    donc argv[0] correspond bien a ton tmp.
    argv[1] est une erreur mémoire, car ne pointe sur rien.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. [WM17] Lire une ligne spécifique d'un fichier.
    Par Papach58 dans le forum Windev Mobile
    Réponses: 3
    Dernier message: 12/03/2014, 00h42
  2. Lire une ligne précise dans un fichier de données
    Par IcArnus dans le forum Débuter
    Réponses: 7
    Dernier message: 05/04/2012, 23h25
  3. [Débutant] Lire une ligne spécifique depuis un fichier
    Par Sperafico dans le forum VB.NET
    Réponses: 7
    Dernier message: 27/01/2012, 14h00
  4. Lire une ligne spécifique dans un fichier texte
    Par ZRemi dans le forum MATLAB
    Réponses: 2
    Dernier message: 26/04/2010, 14h58
  5. Lire une ligne précise dans un tableau
    Par kenru dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 23/12/2009, 15h08

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