none
un fread qui se passe mal RRS feed

  • Question

  • bonjour,

    toujours dans la même procédure, j'ai un problème avec un fread_s

    je vous met le code et les traces

    le code:

    	void CInterbaseManagerM::InititiateDatabase()
    	{
    	    FILE* pLocalFile;
    		int error;
    		int size;
    		System::String^ wsText;
    		SqlCommand^ cmdDatabase;
    		unsigned long dwNbResultFound;
    		size = sText.max_size( );
    		const char* sFileName = "D:\\usr\\Specification Loader\\dev\\DBMS\\MissionDBManager\\com\\MissionCreationScript.sql"; 
     		errno = fopen_s( &pLocalFile, sFileName, "r");
    		error = errno;
    		errno = fread_s( (void*)sText.c_str(), 27600, 27600, 27600, pLocalFile);
    		error = errno;
    		fclose( pLocalFile);
    		cmdDatabase = gcnew SqlCommand(  wsText, myConnexion);
    		StartTransaction( cmdDatabase);
    		ExecuteRequest( cmdDatabase, &dwNbResultFound);
    		CommitTransaction();
    		// puis se déconnecter de la base
    		myConnexion->Close();
    		m_bServerConnected = false;
    		myConnexion = nullptr;
    	}

    le fread_s pars dans le invalideparametterhandler avec les résultats suivants

    function = 0x57616908 "_fread_nolock_s"
    file = 0x57616780 "f:\dd\vctools\crt_bld\self_x86\crt\src\fread.c"
    line = 244
    expression = 0x576167E0 "("buffer too small", 0)"

    Quelques observations sur ce résultat

    l'adresse de la procédure n'existe pas sur mon ordinateur (f:\...)

    buffer too small le paramètre size vaut;         size    2147483646    int

    comment déclarer le buffer pour qu'il soit reconnu par le compilateur et accepté à l'utilisation?


    Jean Noël Martin


    • Modifié JeanNoel53 mardi 9 décembre 2014 16:42
    mardi 9 décembre 2014 09:50

Réponses

  • Un tableau, ça se déclare comme ça :

    unsigned char sText[27600];

    En largement plus simple, vu que vous utilisez C++/CLI, c'est File.ReadAllLine:

    http://msdn.microsoft.com/fr-fr/library/bsy4fhsa(v=vs.110).aspx


    Paul Bacelar, Ex - MVP VC++

    • Marqué comme réponse JeanNoel53 mercredi 10 décembre 2014 05:50
    mercredi 10 décembre 2014 00:05
    Modérateur
  • RTFM

    http://msdn.microsoft.com/fr-fr/library/hh977173.aspx

    La valeur de vos paramètres, c'est un peu n'importe quoi.

    Utilisez un vrai buffet plutôt qu'un c_str() foireux. le c de c_str, c'est pour constant.


    Paul Bacelar, Ex - MVP VC++

    mardi 9 décembre 2014 10:48
    Modérateur
  • Bonjour

    Le fichier à lire est de 26K j'ai donc pris un buffer de 27K. J'ai donc codé

    unsigned char[27600] sText;

    et le compilateur butte sur cette déclaration

    J'ai donc modifié la déclaration qui passe maintenant puis je l'ai passée en wchar_t

    Je récupère un errno qui n'est pas documenté:

    		error	25375	int

    et le texte convertie en String est illisible. je vais réessayer avec des char?

    avec des char le wsText est cohérent.

    mon besoin est de lire un fichier qui comprend des instruction SQL pour l'exécuter ensuite

    il y a peut être une façon plus simple d'y arriver mais je ne la connais pas


    Jean Noël Martin




    • Modifié JeanNoel53 mardi 9 décembre 2014 22:36
    • Marqué comme réponse JeanNoel53 mardi 9 décembre 2014 22:36
    mardi 9 décembre 2014 22:07
  • Le "comment faire", c'est dans la documentation, il y a même un exemple complet.

    Je sais pas d'ou sort ce 2700 ni le 27600, je connais même pas l'encodage de votre fichier SQL, etc..

    La méthode à suivre, c'est de faire simple.

    Donc récupérez votre contenu dans un tableau de d'unsigned char d'une taille suffisante pour avoir tout le fichier SQL, pour le paramètre elementSize mettez 1, pour count mettez la taille de votre buffer.

    Ensuite, vous devrez convertir votre tableau d'unsigned char en fonction de l'encodage de votre fichier.

    Enfin, bon, je comprend pas pourquoi vous embettez avec du code aussi bas niveau quand vous disposez des classe .NET qui font cela bien meiux et plus simplement.


    Paul Bacelar, Ex - MVP VC++

    mardi 9 décembre 2014 17:02
    Modérateur

Toutes les réponses

  • RTFM

    http://msdn.microsoft.com/fr-fr/library/hh977173.aspx

    La valeur de vos paramètres, c'est un peu n'importe quoi.

    Utilisez un vrai buffet plutôt qu'un c_str() foireux. le c de c_str, c'est pour constant.


    Paul Bacelar, Ex - MVP VC++

    mardi 9 décembre 2014 10:48
    Modérateur
  • J'ai essayé avec des wchar_t*, des Sysem::String des Void*, des wchar_t(2700]

    rien ne marche. Alors, plutôt que vous m'expliquiez pourquoi ça ne marche pas j'ai demandé à ce qu'on me dise comment faire.


    Jean Noël Martin

    mardi 9 décembre 2014 16:25
  • Le "comment faire", c'est dans la documentation, il y a même un exemple complet.

    Je sais pas d'ou sort ce 2700 ni le 27600, je connais même pas l'encodage de votre fichier SQL, etc..

    La méthode à suivre, c'est de faire simple.

    Donc récupérez votre contenu dans un tableau de d'unsigned char d'une taille suffisante pour avoir tout le fichier SQL, pour le paramètre elementSize mettez 1, pour count mettez la taille de votre buffer.

    Ensuite, vous devrez convertir votre tableau d'unsigned char en fonction de l'encodage de votre fichier.

    Enfin, bon, je comprend pas pourquoi vous embettez avec du code aussi bas niveau quand vous disposez des classe .NET qui font cela bien meiux et plus simplement.


    Paul Bacelar, Ex - MVP VC++

    mardi 9 décembre 2014 17:02
    Modérateur
  • Bonjour

    Le fichier à lire est de 26K j'ai donc pris un buffer de 27K. J'ai donc codé

    unsigned char[27600] sText;

    et le compilateur butte sur cette déclaration

    J'ai donc modifié la déclaration qui passe maintenant puis je l'ai passée en wchar_t

    Je récupère un errno qui n'est pas documenté:

    		error	25375	int

    et le texte convertie en String est illisible. je vais réessayer avec des char?

    avec des char le wsText est cohérent.

    mon besoin est de lire un fichier qui comprend des instruction SQL pour l'exécuter ensuite

    il y a peut être une façon plus simple d'y arriver mais je ne la connais pas


    Jean Noël Martin




    • Modifié JeanNoel53 mardi 9 décembre 2014 22:36
    • Marqué comme réponse JeanNoel53 mardi 9 décembre 2014 22:36
    mardi 9 décembre 2014 22:07
  • Un tableau, ça se déclare comme ça :

    unsigned char sText[27600];

    En largement plus simple, vu que vous utilisez C++/CLI, c'est File.ReadAllLine:

    http://msdn.microsoft.com/fr-fr/library/bsy4fhsa(v=vs.110).aspx


    Paul Bacelar, Ex - MVP VC++

    • Marqué comme réponse JeanNoel53 mercredi 10 décembre 2014 05:50
    mercredi 10 décembre 2014 00:05
    Modérateur