2010-06-21 8 views
1

Je voudrais enregistrer des fichiers avec des noms différents dans une boucle. J'utilise une bibliothèque qui a besoin d'un char comme un paramètre du fichier ...int à la conversion de chaîne

for(int i=0;i<nodes;i++){ 
for(int j=0;j<nodes;j++){ 
    char a[20]="test"; 
    char c[20]="xout.dat"; 
Lib::SaveFile(_T(a), _T(c)); 
}} 

Le code ci-dessus fonctionne, mais je voudrais changer le nom du xout.mid à l'entier correspondant donc je recevrais i fichiers * j avec différents names.i et aller j de 0 à environ 30.

Je voudrais obtenir un omble chevalier avec le nom i_j_xout.dat

+3

char est un seul caractère. Vous voulez dire une chaîne composée de plusieurs caractères. – Sjoerd

+0

Oui! Et c'est aussi pourquoi je ne l'ai pas trouvé sur google ... –

+0

Est-ce que la macro '_T' fonctionne même avec des tableaux de caractères? – sbi

Répondre

2
char name[30]; 
sprintf(name, "%d-%d-%s", i, j, c); 
+0

Oh merci ... je suppose que c'est l'exemple numéro 2 après "hello world", j'ai eu quelques problèmes avec la différence avec char et string .. –

+1

Je sais que sur les architectures actuelles le, erm, "hasard" de débordement 'name 'est marginal, mais je pense que, en général, l'utilisation de' sprintf() 'justifie un avertissement. – sbi

+0

Salut, essayez généralement de ne pas utiliser la famille de fonctions '[f/s] printf' en C++. Lorsque vous avez des problèmes de débordement de tampon causés par eux, votre application se bloque à différents endroits et le problème est difficile à suivre. Le code ci-dessus ne générera pas de plantage, mais il est recommandé d'utiliser du code sécurisé (famille de classes 'std :: o [f/string] stream'). – utnapistim

-1

Utilisez la fonction sprintf():

for(int i=0;i<nodes;i++){ 
for(int j=0;j<nodes;j++){ 
    char c[20]; 
    char a[20]="test"; 
    sprintf(c, "%d_%d_xout.dat", i, j); 
Lib::SaveFile(_T(a), _T(c)); 
}} 
+0

Pourquoi 'c' est-il alloué dynamiquement? Je ne sais pas 'Lib :: SaveFile()', mais s'il se lance, alors cela fuit. L'utilisation d'une variable automatique éviterait cela. – sbi

+0

Édité, merci. – PeterK

2

Au lieu d'utiliser des tampons CHAR et sprintf, envisagez d'utiliser std :: string et std :: ostringstream:

#include <sstream> 
#include <string> 

[...] 

std::basic_string<TCHAR> nameA = _T("test"); 
std::basic_ostringstream<TCHAR> nameC; 
for(int i=0;i<nodes;i++){ 
    for(int j=0;j<nodes;j++){ 
     nameC.str(_T("")); 
     nameC << i << "_" << j << "_xout.dat"; 
     Lib::SaveFile(nameA.c_str(), nameC.str().c_str()); 
    } 
}