2010-11-20 4 views
12

Je voudrais faire quelque chose comme ceci: Dans une boucle, la première itération écrit du contenu dans un fichier nommé file0.txt, deuxième itération file1.txt et ainsi de suite, augmentez simplement le nombre.Comment changer dynamiquement le nom de fichier lors de l'écriture dans une boucle?

FILE *img; 
int k = 0; 
while (true) 
{ 
      // here we get some data into variable data 

    file = fopen("file.txt", "wb"); 
    fwrite (data, 1, strlen(data) , file); 
    fclose(file); 

    k++; 

      // here we check some condition so we can return from the loop 
} 

Répondre

15
int k = 0; 
while (true) 
{ 
    char buffer[32]; // The filename buffer. 
    // Put "file" then k then ".txt" in to filename. 
    snprintf(buffer, sizeof(char) * 32, "file%i.txt", k); 

    // here we get some data into variable data 

    file = fopen(buffer, "wb"); 
    fwrite (data, 1, strlen(data) , file); 
    fclose(file); 

    k++; 

    // here we check some condition so we can return from the loop 
} 
+1

+1 pour 'snprintf' sur' sprintf'. –

2
FILE *img; 
int k = 0; 
while (true) 
{ 
    // here we get some data into variable data 
    char filename[64]; 
    sprintf (filename, "file%d.txt", k); 

    file = fopen(filename, "wb"); 
    fwrite (data, 1, strlen(data) , file); 
    fclose(file); 
    k++; 

      // here we check some condition so we can return from the loop 
} 
2

afin de créer le nom du fichier en utilisant sprintf:

char filename[16]; 
sprintf(filename, "file%d.txt", k); 
file = fopen(filename, "wb"); ... 

(bien que ce soit une solution C de sorte que la balise n'est pas correct)

7

Une autre façon de faire en C++:

#include <iostream> 
#include <fstream> 
#include <sstream> 

int main() 
{ 
    std::string someData = "this is some data that'll get written to each file"; 
    int k = 0; 
    while(true) 
    { 
     // Formulate the filename 
     std::ostringstream fn; 
     fn << "file" << k << ".txt"; 

     // Open and write to the file 
     std::ofstream out(fn.str().c_str(),std::ios_base::binary); 
     out.write(&someData[0],someData.size()); 

     ++k; 
    } 
} 
+0

Belle solution, a travaillé avec moi :) –

1

J'ai accompli ceci de la manière ci-dessous. Notez que contrairement à quelques autres exemples, cela va effectivement compiler et fonctionner comme prévu sans aucune modification à côté des préprocesseurs inclus. La solution ci-dessous itère cinquante noms de fichiers.

int main(void) 
{ 
    for (int k = 0; k < 50; k++) 
    { 
     char title[8]; 
     sprintf(title, "%d.txt", k); 
     FILE* img = fopen(title, "a"); 
     char* data = "Write this down"; 
     fwrite (data, 1, strlen(data) , img); 
     fclose(img); 
    } 
} 
+0

vous voulez dire 51 noms: 0 et 50 chaque compte comme un nom (pas sûr de qui est celui que vous avez oublié de tenir compte). Vous pouvez le voir rapidement en notant que de 0 à 10 (<11) il y a en réalité 11 noms. – insaner

+0

Je comprends. c'est réparé. –

Questions connexes