Wie ändern Sie die Dateinamenerweiterung gespeichert in einem string, die in C++?
Okay hier ist der deal, ich bin dabei, ein intro zu C++ - Kurs an meiner Universität und habe Schwierigkeiten, herauszufinden, wie das ändern der Dateiendung einer Datei. Erste, was wir wohl zu tun ist, Lesen Sie in einem .txt-Datei und die Anzahl der Wörter, Sätze, Vokale etc. Nun, ich habe diese aber der nächste Schritt ist, was Sie bedrückt mich. Wir sind dann angenommen, erstellen Sie eine neue Datei mit dem gleichen Dateinamen wie die Eingabedatei, aber mit der Erweiterung .code statt .txt (in die neue Datei, die wir sind dann zu Kodieren Sie die Zeichenfolge, die durch das hinzufügen von Zufallszahlen zu den ASCII-code der einzelnen Zeichen, wenn Sie interessiert waren). Wird ein Anfänger in der Programmierung, ich bin mir nicht ganz sicher, wie dies zu tun. Ich bin mit dem folgenden Stück code, um auf den ersten zu bekommen die input-Datei:
cout << "Enter filename: ";
cin >> filename;
infile.open(filename.c_str());
Ich gehe davon aus, dass eine neue Datei zu erstellen, ich werde mit so etwas wie:
outfile.open("test.code");
Aber ich will nicht wissen, was ist der name der Datei, bis der Benutzer es so ist kann ich nicht sagen "test.txt". Also wenn jemand weiß wie das zu ändern Endung, wenn ich eine neue Datei erstellen ich würde es sehr begrüßen!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es mehrere Ansätze.
Können Sie die super-lazy-Ansatz, und Sie haben, geben Sie nur den Dateinamen, nicht die .txt-Erweiterung. In diesem Fall können Sie Sie anfügen .txt, um es zu öffnen Sie die input-Datei.
Dann rufen Sie einfach
Den nächsten Ansatz wäre es, den gesamten Dateinamen einschließlich der Erweiterung, und fügen Sie einfach .code, um es so müsstest du testen.txt.code.
Es ist ein bisschen zweideutig, wenn dies akzeptabel ist oder nicht.
Schließlich können Sie mit
std::string
Methodenfinden
, undreplace
man den Dateinamen ohne Erweiterung, und verwenden Sie diese..c_str()
konvertieren vonstd::string
zuconst char*
. Quelle: c_str()Manchmal kann ich mir diese Frage und am Ende auf dieser Seite, also für die Zukunft, hier ist die single-line syntax:
Natürlich, wenn dies nicht Hausaufgaben sondern eine Reale-Welt-Projekt, würden Sie wahrscheinlich tun, sich selbst-wie auch andere Menschen Lesen Ihre code-eine Bevorzugung mit Boost.Dateisystem's
replace_extension()
anstatt Ihre eigenen Rollen. Es gibt einfach keine Funktionalität, die ist einfach genug, dass Sie konnte nicht kommen mit einem bug, zumindest in einer Ecke Fall.Nicht zu verschenken, da lernen ist der ganze Sinn der übung, aber hier ist ein Tipp.
Du bist wahrscheinlich gehen zu wollen, eine Kombination von
find_last_of
undreplace
.Hier ein paar Tipps. Sie haben einen Dateinamen, der bereits eingegeben ist - was Sie tun möchten ist, bekommen den Teil des Dateinamens, die nicht die Erweiterung:
Geschrieben haben, die Funktion, Sie können es verwenden, um erstellen den Namen der neuen Datei:
Pseudo-code wäre, etwas zu tun, wie
Zur änderung outFilename, Blick auf strrchr und strcpy als Ausgangspunkt (kann auch mehr sein, geeignete Methoden -- das wäre toll mit einem char* obwohl)
In Windows (mindestens) können Sie _splitpath sezieren der Basis Namen von dem rest der Stücke, und dann wieder zusammenbauen, Sie mit Ihrem Lieblings-string-Formatierer.
warum nicht mit der string-Methode
find_last_of()
?Möchte ich nur anfügen ".code" auf dem Dateinamen, den der Benutzer eingegeben. Wenn Sie eingegeben "test.txt" dann wird die Ausgabe-Datei "test.txt.code". Wenn diese in einem Dateinamen ohne Erweiterung, wie "test", dann wird die Ausgabe-Datei "test.code".
Ich verwende diese Technik die ganze Zeit mit Programmen, die Erzeugung von output-Dateien und eine Art von Protokollierung/Diagnose-Ausgabe. Es ist einfach zu implementieren und, meiner Meinung nach, macht die Beziehungen zwischen Dateien viel deutlicher.
Wie wäre es mit strstr:
Was Sie tun müssen ist, kopieren Sie die Originaldatei in eine neue variable, wo können Sie die Erweiterung ändern. So etwas wie dieses:
Es ist möglich, Sie könnte verwenden Sie die "Dateiname" - variable, wenn Sie nicht brauchen, um die original-Dateinamen, um für die spätere Verwendung. In diesem Fall können Sie einfach verwenden:
Der Schlüssel ist der Blick auf die definition der C++ - string-Klasse und verstehen, was die einzelnen member-Funktion übernimmt. Mit rfind wird die Suche rückwärts durch die Schnur und Sie nicht versehentlich auf irgendwelche extensions im Ordner-Namen, die möglicherweise Teil des ursprünglichen Dateinamens (z.B. "C:\MyStuff.School\MyFile.txt"). Bei der Arbeit mit den offsets aus finden, rfind, etc., Sie wollen auch vorsichtig sein, Sie richtig zu verwenden, wenn die Weitergabe als Grafen zu anderen Methoden (z.B. benutzen Sie assign(Datei, 0, extPos-1), weisen(filename, 0, extPos), assign(Datei, 0, extPos+1)).
Hoffe, das hilft.
Sehr Einfach:
Ergebnis:
"Datei.abc"