2016-01-20 1 views
-2

Une question générale de l'écriture à des fichiers dans une boucle et en dehors d'une boucle:écrire dans le fichier dans un cpp boucle

suppose que j'ai le code suivant:

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

using namespace std; 
void printToFile(string name, double **Array) 
{ 
    ofstream myfile; 
    myfile.open(name); 
    for (unsigned int m=0; m<5; m++) 
    { 
     for (unsigned int n=0; n<10; n++) 
     { 
      myfile << Array[m][n] << " "; 
     } 
    } 
    myfile.close(); 
} 

int main() 
{ 
    int i,j; 
    double **Arr; 
    string str; 
    ostringstream oss; 

    for (i=0; i<5; i++) 
    {   
     for (j=0; j<10; j++) 
     { 
      // some calculation that yields Arr with size [5][10] 
      str=""; 
      oss << "Arr_j_"<<j+1<<"_i_"<<i+1<<".txt"; 
      str = oss.str(); 
      printToFile(str,Arr); 
     } 
    } 
    return 0; 
} 

Je ne peux pas sembler obtenir le nom des fichiers à droite, ce que je reçois est:

de plus, ma finition d'exécution de code mais les fichiers de sortie arrêtent à i=2, j'apprécierions également des commentaires dont la vapeur à utiliser (ostream, fstream, sstream, etc ...)

+0

lieu de 'ofstream mon_fichier; myfile.open (name); 'utilise l'initialisation:' ofstream myfile (nom); Et vous n'avez pas besoin de fermer explicitement le fichier. Le destructeur le fait. –

Répondre

3

Vous ne supprimez jamais le ostringstream après chaque itération. Pour ce faire automatiquement pour vous, vous pouvez simplement déplacer la déclaration oss dans la boucle. De cette façon, après chaque boucle, le flux sera détruit et vous commencerez avec un nouveau flux sur l'itération suivante.

for (i=0; i<5; i++) 
{   
    for (j=0; j<10; j++) 
    { 
     ostringstream oss; 
     // some calculation that yields Arr with size [5][10] 
     oss << "Arr_j_"<<j+1<<"_i_"<<i+1<<".txt"; 
     printToFile(oss.str(),Arr); 
    } 
} 

J'ai aussi retiré str="" et str = oss.str(); comme il est pas nécessaire. Vous pouvez simplement utiliser oss.str() comme un paramètre à printToFile et se débarrasser de str. Je ne sais pas si ce serait plus rapide ou non, mais vous pouvez éviter d'utiliser n'importe quel type de chaîne et construire la chaîne dans l'appel de fonction en utilisant std::to_string pour convertir les index en chaînes. qui ressemblerait

for (i=0; i<5; i++) 
{   
    for (j=0; j<10; j++) 
    { 
     // some calculation that yields Arr with size [5][10] 
     printToFile("Arr_j_" + std::to_string(j+1) + "_i_" + std::to_string(i+1) + ".txt", Arr); 
    } 
} 
0

str et oss déclare dans la boucle, vous n'êtes pas oss nettoyez

for (i=0; i<5; i++) 
    {   
     for (j=0; j<10; j++) 
     { 
      // some calculation that yields Arr with size [5][10] 
      string str; 
      ostringstream oss; 
      oss << "Arr_j_"<<j+1<<"_i_"<<i+1<<".txt"; 
      str = oss.str(); 
      printToFile(str,Arr); 
     } 
    }