2017-09-28 4 views
0

Wie kann ich die gleiche Funktionsvorlage verwenden, um 3 verschiedene Arrays in 3 verschiedenen Dateien zu speichern? (Ein Array pro Datei)Wie kann ich die gleiche Funktionsvorlage verwenden, um 3 verschiedene Arrays in 3 verschiedenen Dateien zu speichern?

Die Array-Typen sind int, float und char

Der nächstgelegene ich bekommen habe ist der folgende Code:

template <typename T> 
    void saveToTextFile(T *arr, const int size) 
    { 
    ofstream outFile("arraytextfile.txt", ios::out);` 

     for(unsigned int i = 0; i < size; ++i) 
     { 
      outFile << arr[i] << ' '; 
     }// end for 

     outFile << endl; 

     outFile.close(); 
    } 

Dies erzeugt natürlich eine neue Textdatei beim ersten Aufruf und schneidet die Datei beim erneuten Öffnen ab. Ich muss diese Vorlage 3 verschiedene Male aufrufen und jedes Mal Daten in eine neue Datei speichern. Jede Datei sollte ein anderes Array enthalten.

+1

Übergeben Sie den Namen der Datei zu erstellen, als zusätzlicher Parameter für diese Funktion, zu offensichtlich, eine Lösung? –

+0

Das ist genau die Lösung, nach der ich gesucht habe! Vielen Dank! –

Antwort

0

Warum nicht passieren Sie die filePath über Parameter, mit einem pointer

void saveToTextFile(T *arr, const int size, const char *outputFilePath) { 
    ofstream outFile(outputFilePath , ios::out);` 
} 

Sie die filePath auf Ihre Funktion übergeben möchten:

const char * location = "a/c/d.text".c_str(); 
saveToTextFile(arr, 5, location) // or for short 
saveToTextFile(arr, 5,"a/c/d.text".c_str()) 
+0

'" a/c/d.text ".c_str();' hab hier einen Fehler. '" a/c/d.text "' ist ein "const char" -Array, kein 'std :: string', also gibt es nicht nur kein' c_str() ', das aufgerufen wird, es gibt keinen Grund, irgendwas aufzurufen. Die Umwandlung in ein 'const char *' ist kostenlos. – user4581301

0

Wenn Sie sicher sind, dass Du rufst diese Funktion mit nur drei verschiedenen Typen auf, und du verwendest mindestens C++ 11. Eine einfache (aber nicht wirklich elegante) Lösung ist die Verwendung von types traits und die Überprüfung des Typs; so etwas wie

std::ofstream outFile(
    std::is_same<T, char>::value 
     ? "file-char.txt" 
     : (std::is_same<T, int>::value 
     ? "file-int.txt" 
     : "file-double.txt"), std::ios::out); 

Wenn Sie C++ 11 oder höher verwenden kann nicht, können Sie std::is_same mit etwas simulieren wie

folgt
template <typename, typename> 
struct isSame 
{ static const bool value = false; }; 

template <typename T> 
struct isSame<T, T> 
{ static const bool value = true; }; 

Aber eine generische Lösung, können Sie typeid(); mit gutem Beispiel

std::string fName = "file-"; 

fName += typeid(*arr).name(); 
fName += ".txt"; 

std::ofstream outFile(fName, std::ios::out); 

aber nimm in dieser Zählung die typeid() ein name() geben, die Umsetzung abhängig ist.

Verwandte Themen