2016-12-05 2 views
0

Um mehrere Dateien mit einer for-Schleife in C++ zu erstellen.Wie erstellt man mehrere Dateien mit C++

Ziel: - Um mehrere Dateien in dem entsprechenden Ordner als 1.txt, mit dem Namen zu erstellen 2.txt, 3.txt

Hier ist mein Beispielcode ist:

int co = 3; 
for (int i = 1; i <= co; i++) 
{ 
    ofstream file; 
    file.open (i+".txt"); 
    file.close(); 
} 

Dieser Code erstellt drei Dateien: t, xt und txt.

Was passiert in diesem Code? und Was ist falsch an meinem Code?

+0

Sie müssen vorher in Zeichenfolge konvertieren. –

+0

Versuchen Sie, Ihre i-Variable in String zu konvertieren. – Prometheus

+0

Das Idiom 'i +". Txt "' funktioniert so, als wäre '" .txt "' ein * Array * und man erhält einen Offset zum 'i'ten Zeichen dieser Zeichenkette. Daher die "txt" (Offset 1), "xt" (Offset 2) und "t" (Offset 3). – usr2564301

Antwort

1

In C++ können Sie ein String-Literal nicht einfach mit einer Ganzzahl "verketten". Ein String-Literal wird in einen Zeiger auf ein konstantes Zeichen zerlegt (char const *) und es gelten Zeigerarithmetikregeln.

Beim Addieren oder Subtrahieren eines ganzzahligen Werts von einem Zeiger ist das Ergebnis ein Zeiger auf ein Objekt, der die Anzahl der weiter im Speicher befindlichen Elemente angibt - und dies gilt natürlich nur, wenn die Grenzen dieses Speichers nicht überschritten werden.

0

Sie müssen konvertieren i-std::string zuerst:

int co = 3; 
for (int i = 1; i <= co; i++){ 
    ofstream file; 
    file.open (std::to_string(i) + ".txt"); //Here 
    file.close(); 
} 
0

Sie müssen i in eine Zeichenfolge konvertieren, um sie zu verketten operator+ verwenden, andernfalls Sie versehentlich ausführt:

// C++11 
int co = 3; 
for (int i = 1; i <= co; i++) 
{ 
    ofstream file; 
    file.open (std::to_string(i) + ".txt"); 
    file.close(); 
} 

Wenn Sie keinen Zugriff auf C++ 11 haben (oder wenn Sie vermeiden möchten, explizit "i konvertieren und dann verketten") können Sie std::ostringstream verwenden:

// C++03 
std::ostringstream oss; 
int co = 3; 
for (int i = 1; i <= co; i++) 
{ 
    ofstream file; 

    oss << i << ".txt"; // `i` is automatically converted 
    file.open (oss.str()); 
    oss.str(""); // clear `oss` 

    file.close(); 
} 

Hinweis:Klirren ++ Fänge dieser Fehler mit der -Wstring-plus-int Warnflag (wandbox example).

+0

Sie liegen falsch. Zuallererst '' .txt "' ist nicht 'std :: string'. Zweitens ist 'int + char *' perfekt definiert: es bewegt den Zeiger. Aus diesem Grund erhält OP in jeder Iteration Teile des Dateinamens '.txt'. – freakish

+0

@freakish: danke, behoben. Ich bin zu sehr an das "..." s'-Literal gewöhnt, ich denke :( –

+0

Auch im Fall von clang ++ scheint es, dass "-Wstring-plus-int" immer diese Warnung anzeigt, egal was "i" ist Das ist zumindest das, was ich beobachtet habe, aber nicht sicher – freakish

Verwandte Themen