Meilleur auteur de réponses
un fread qui se passe mal

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
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
-
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++
- Proposé comme réponse Teodora SharkovaModerator mardi 9 décembre 2014 13:45
- Non proposé comme réponse JeanNoel53 mardi 9 décembre 2014 16:43
- Marqué comme réponse Teodora SharkovaModerator mercredi 10 décembre 2014 13:35
-
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
-
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++
- Marqué comme réponse Teodora SharkovaModerator mercredi 10 décembre 2014 13:36
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++
- Proposé comme réponse Teodora SharkovaModerator mardi 9 décembre 2014 13:45
- Non proposé comme réponse JeanNoel53 mardi 9 décembre 2014 16:43
- Marqué comme réponse Teodora SharkovaModerator mercredi 10 décembre 2014 13:35
-
-
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++
- Marqué comme réponse Teodora SharkovaModerator mercredi 10 décembre 2014 13:36
-
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
-
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