Fichier txt vers ListCtrl

Résolu
gregdu80 Messages postés 6 Date d'inscription lundi 4 mai 2009 Statut Membre Dernière intervention 15 mai 2009 - 5 mai 2009 à 14:31
gregdu80 Messages postés 6 Date d'inscription lundi 4 mai 2009 Statut Membre Dernière intervention 15 mai 2009 - 15 mai 2009 à 16:21
Bonjour à tous et à toutes,
dans le cadre de mon stage, je doit lire un fichier au format csv et récupérer les données afin de les afficher dans une ListCtrl sous visual C++ 6.
Le problème se trouve dans le fait que le fichier contient 9 colonnes et une centaine de ligne, et que le code que j'ai tapé me permet de lire uniquement les deux premières colonnes (sur toutes les lignes) du fichier csv.

Voici le code correspondant :

bool b_result = true;
char format[7];
CString str,str_tmp;
char delim = ';';

double freq,imped1,adapt1,imped2,adapt2;

m_list_carac_boite_antenne.DeleteAllItems();

CWinApp * theApp = AfxGetApp();
if(theApp)
{
str_tmp = theApp->GetProfileString("SEPARATEURS_CSV","CHAMP",";");
delim = str_tmp.GetAt(0);
}

sprintf(format,"%s%c%s","%lf",delim,"%lf");
CStdioFile fileBA;
if(!fileBA.Open((LPCTSTR)strFileBA,CFile::modeRead))
{
AfxMessageBox("impossible d'ouvrir le fichier "+strFileBA);
return false;
}
else
{
while(fileBA.ReadString(str))
{
if(sscanf((LPCTSTR)str,format,&freq,&imped1,&adapt1,&imped2,&adapt2) == 2)
{
str_tmp.Format("%1.lf",freq);
m_list_carac_boite_antenne.InsertItem(m_list_carac_boite_antenne.GetItemCount(),str_tmp);
str_tmp.Format("%1.4lf",imped1);
m_list_carac_boite_antenne.SetItemText(m_list_carac_boite_antenne.GetItemCount() - 1,1,str_tmp);
str_tmp.Format("%1.3lf",adapt1);
m_list_carac_boite_antenne.SetItemText(m_list_carac_boite_antenne.GetItemCount() - 2,2,str_tmp);
str_tmp.Format("%1.4lf",imped2);
m_list_carac_boite_antenne.SetItemText(m_list_carac_boite_antenne.GetItemCount() - 3,3,str_tmp);
str_tmp.Format("%1.3lf",adapt2);
m_list_carac_boite_antenne.SetItemText(m_list_carac_boite_antenne.GetItemCount() - 4,4,str_tmp);
}
}
fileBA.Close();
}
return b_result;
}

Voilà si quelqu'un peut voler à mon secours, cela serait vraiment super!!
Merci

9 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
15 mai 2009 à 15:15
Vi tout à fait cela vient de là. Faut que tu te tapes %s%c%s%c...

Pour info, tu as l'aide de toutes les fonctions vraiment standards y compris sprintf, sur ce site.
3
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
14 mai 2009 à 19:05
Salut,

Trois fois la même question... Je supprime les deux autres.

Détail plus ton problème. Ton sscanf lit tout ce qu'il faut dans le fichier, non ?
0
gregdu80 Messages postés 6 Date d'inscription lundi 4 mai 2009 Statut Membre Dernière intervention 15 mai 2009
15 mai 2009 à 09:39
Oui je sais mais comme je n'avais pas de réponse je postait ma question différemment. Désolé.
Et bien en fait je pense que mon sscanf et fait pour ne lire que les deux premières colennes de mon fichier, or, il faudrait que je puisse lire chaque ligne et chaque colonne.
Pour précision mon fichier contient 9 colonnes, chaque valeur est séparé par un ";".
J'espére avoir été plus clair...
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
15 mai 2009 à 11:44
Bin modifie ton sscanf !

Pourquoi un test == 2 d'ailleurs, si tu veux 9 valeurs ?
if(sscanf((LPCTSTR)str,format,&freq,&imped1,&adapt1,&imped2,&adapt2) == 2)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gregdu80 Messages postés 6 Date d'inscription lundi 4 mai 2009 Statut Membre Dernière intervention 15 mai 2009
15 mai 2009 à 13:17
Oui j'ai déjà essayé de modifier mon sscanf, mais lorsque je mets une autre valeur que 2 ca ne fonctionne pas. Le seul moyen d'avoir quelque chose est de mettre ==2 ou rien du tout...
Cela reste un mystère pour moi!!
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
15 mai 2009 à 14:38
Ah vi, c'est à cause du format :
sprintf(format,"%s%c%s","%lf",delim,"%lf");

Ca te fait %lf;%lf, et c'est ça que tu passes au sscanf.
Il faut que tu mette plus de choses dans ta chaîne de formatage.

Autre choses, tu parles de 9 colonnes, mais ton sscanf est près à récupérer 5 valeurs.
0
gregdu80 Messages postés 6 Date d'inscription lundi 4 mai 2009 Statut Membre Dernière intervention 15 mai 2009
15 mai 2009 à 14:59
Le bout de code plus haut était juste un test pour voir si je pouvais le faire sur moins de valeurs...
J'ai essayé ce que tu m'as dit, mais j'ai pas l'impression que le problème vienne de là puisque ca ne fonctionne toujours pas...

bool CChargementBoiteAntenneEtAntenneDlg::loadBA(CString strFileBA)
{
bool b_result = true;
char format[9];
CString str,str_tmp;
char delim = ';';

double freq,imped1,adapt1;
double imped2,adapt2;
double imped3,adapt3;
double imped4,adapt4;

m_list_carac_boite_antenne.DeleteAllItems();

CWinApp * theApp = AfxGetApp();
if(theApp)
{
str_tmp = theApp->GetProfileString("CSV_DELIMITERS","DELIM",";");
delim = str_tmp.GetAt(0);
}

sprintf(format,"%s%c%s","%lf",delim,"%lf",delim,"%lf",delim,"%lf",delim,"%lf",delim,"%lf",delim,"%lf",delim,"%lf",delim,"%lf");
CStdioFile file;
if(!file.Open((LPCTSTR)strFileBA,CFile::modeRead))
{
AfxMessageBox("impossible d'ouvrir le fichier "+strFileBA);
return false;
}
else
{
while(file.ReadString(str))
{
if (sscanf((LPCTSTR)str,format,&freq,&imped1,&adapt1,&imped2,&adapt2,&imped3,&adapt3,&imped4,&adapt4))
{
str_tmp.Format("%1.lf",freq);
m_list_carac_boite_antenne.InsertItem(m_list_carac_boite_antenne.GetItemCount(),str_tmp);
str_tmp.Format("%1.4lf",imped1);
m_list_carac_boite_antenne.SetItemText(m_list_carac_boite_antenne.GetItemCount() - 1,1,str_tmp);
str_tmp.Format("%1.3lf",adapt1);
m_list_carac_boite_antenne.SetItemText(m_list_carac_boite_antenne.GetItemCount() - 1,2,str_tmp);
str_tmp.Format("%1.4lf",imped2);
m_list_carac_boite_antenne.SetItemText(m_list_carac_boite_antenne.GetItemCount() - 1,3,str_tmp);
str_tmp.Format("%1.3lf",adapt2);
m_list_carac_boite_antenne.SetItemText(m_list_carac_boite_antenne.GetItemCount() - 1,4,str_tmp);
str_tmp.Format("%1.4lf",imped3);
m_list_carac_boite_antenne.SetItemText(m_list_carac_boite_antenne.GetItemCount() - 1,5,str_tmp);
str_tmp.Format("%1.3lf",adapt3);
m_list_carac_boite_antenne.SetItemText(m_list_carac_boite_antenne.GetItemCount() - 1,6,str_tmp);
str_tmp.Format("%1.4lf",imped4);
m_list_carac_boite_antenne.SetItemText(m_list_carac_boite_antenne.GetItemCount() - 1,7,str_tmp);
str_tmp.Format("%1.3lf",adapt4);
m_list_carac_boite_antenne.SetItemText(m_list_carac_boite_antenne.GetItemCount() - 1,8,str_tmp);
}
}
file.Close();
}
return b_result;
}

Est-ce que le problème ne viendrait pas de la partie %s%c%s ?
0
gregdu80 Messages postés 6 Date d'inscription lundi 4 mai 2009 Statut Membre Dernière intervention 15 mai 2009
15 mai 2009 à 15:48
Bon et bien j'ai tappé ceci dans mon sprintf :
sprintf(format,"%s%c%s%c%s%c%s%c%s%c%s%c%s%c%s%c%s","%lf",delim,"%lf",delim,"%lf",delim,"%lf",delim,"%lf",delim,"%lf",delim,"%lf",delim,"%lf",delim,"%lf");
mais ca ne fonctionne toujours pas...
Je ne comprends pas pourquoi...
0
gregdu80 Messages postés 6 Date d'inscription lundi 4 mai 2009 Statut Membre Dernière intervention 15 mai 2009
15 mai 2009 à 16:21
Bon en fait c'est bon a priori le problème venait de format[9] il suffisait juste de l'augmenter pour que ca fonctionne.
Je te remercie tu as trouvé la solution à mon problème que je trainais depuis un bon moment
0
Rejoignez-nous