2012-10-28 2 views
4

J'essaye d'écrire un programme en C++, ce qui crée des fichiers (.txt) et écrit le résultat en eux. Le problème est qu'une quantité de ces fichiers n'est pas fixée au début et apparaît seulement vers la fin du programme. Je voudrais nommer ces fichiers comme "file_1.txt", "file_2.txt", ..., "file_n.txt", où n est un entier.Création automatique de noms de fichiers C++

Je ne peux pas utiliser la concaténation car le nom de fichier requiert le type "const char *" et je n'ai trouvé aucun moyen de convertir "string" en ce type. Je n'ai pas trouvé de réponse via Internet et serai vraiment heureux si vous m'aidez.

+0

Avez-vous regardé la fonction 'c_str'? http://en.cppreference.com/w/cpp/string/basic_string/c_str –

+0

Juste parce que le nom de fichier doit être un 'const char *' à la fin ne signifie pas que vous êtes coincé avec lui pour l'ensemble de votre programme . Vous devriez utiliser 'std :: string' autant que vous le pouvez, puis obtenir un' const char * 'de celui-ci seulement quand vous l'avez vraiment. –

Répondre

5

Vous pouvez obtenir un const char* à partir d'un std::string en utilisant la fonction membre c_str.

std::string s = ...; 
const char* c = s.c_str(); 

Si vous ne souhaitez pas utiliser std::string (peut-être vous voulez ne pas faire les allocations de mémoire), vous pouvez utiliser snprintf pour créer une chaîne formatée:

#include <cstdio> 
... 
char buffer[16]; // make sure it's big enough 
snprintf(buffer, sizeof(buffer), "file_%d.txt", n); 

n ici est le numéro dans le nom de fichier.

+0

Une remarque sur les allocations de mémoire de 'std :: string': de nombreuses implémentations font l'optimisation de petite chaîne où les petites chaînes n'alloueront pas de mémoire, mais ce n'est pas garanti. –

+0

Merci beaucoup! :) – Tatiana

+0

@PeterAlexander: Eh bien, la version dirkumware de MSVC a SSO alors que libstdC++ de gcc ne l'a pas. Je pense que libC++ de clang a également SSO, mais comme il est à peine porté en dehors d'OS X, il est peu intéressant pour la plupart. –

5
for(int i=0; i!=n; ++i) { 
    //create name 
    std::string name="file_" + std::to_string(i) + ".txt"; // C++11 for std::to_string 
    //create file 
    std::ofstream file(name); 
    //if not C++11 then std::ostream file(name.c_str()); 
    //then do with file 
} 
1

... une autre façon de bulid le nom du fichier

#include <sstream> 

int n = 3; 
std::ostringstream os; 
os << "file_" << n << ".txt"; 

std::string s = os.str(); 
0

Exemple de code:

#include <iostream> 
#include <fstream> 
#include <string> 
#include <sstream> 
using namespace std; 

string IntToStr(int n) 
{ 
    stringstream result; 
    result << n; 
    return result.str(); 
} 

int main() 
{ 
    ofstream outFile; 
    int Number_of_files=20; 
    string filename; 


    for (int i=0;i<Number_of_files;i++) 
    { 
     filename="file_" + IntToStr(i) +".txt"; 
     cout<< filename << " \n"; 

     outFile.open(filename.c_str()); 
     outFile << filename<<" : Writing this to a file.\n"; 
     outFile.close(); 
    } 


    return 0; 
} 
0

J'utilise le code suivant pour cela, vous pouvez trouver ce utile.

std::ofstream ofile; 

for(unsigned int n = 0; ; ++ n) 
{ 
    std::string fname = std::string("log") + std::tostring(n) << + std::string(".txt"); 

    std::ifstream ifile; 
    ifile.open(fname.c_str()); 

    if(ifile.is_open()) 
    { 
    } 
    else 
    { 
     ofile.open(fname.c_str()); 
     break; 
    } 

    ifile.close(); 
} 

if(!ofile.is_open()) 
{ 
    return -1; 
} 

ofile.close(); 
Questions connexes