Fichier txt vers ListCtrl

[Résolu]
Signaler
Messages postés
6
Date d'inscription
lundi 4 mai 2009
Statut
Membre
Dernière intervention
15 mai 2009
-
Messages postés
6
Date d'inscription
lundi 4 mai 2009
Statut
Membre
Dernière intervention
15 mai 2009
-
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

Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
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.
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
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 ?
Messages postés
6
Date d'inscription
lundi 4 mai 2009
Statut
Membre
Dernière intervention
15 mai 2009

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...
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
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)
Messages postés
6
Date d'inscription
lundi 4 mai 2009
Statut
Membre
Dernière intervention
15 mai 2009

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!!
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
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.
Messages postés
6
Date d'inscription
lundi 4 mai 2009
Statut
Membre
Dernière intervention
15 mai 2009

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 ?
Messages postés
6
Date d'inscription
lundi 4 mai 2009
Statut
Membre
Dernière intervention
15 mai 2009

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...
Messages postés
6
Date d'inscription
lundi 4 mai 2009
Statut
Membre
Dernière intervention
15 mai 2009

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