Okay, hier ist der Deal, ich nehme eine Einführung in den C ++ - Kurs an meiner Universität und habe Probleme herauszufinden, wie man die Erweiterung einer Datei ändert. Zuerst sollten wir in einer .txt-Datei lesen und Wörter, Sätze, Vokale usw. zählen. Nun, ich habe das verstanden, aber der nächste Schritt ist, was mich beunruhigt. Wir sollen dann eine neue Datei erstellen, die den gleichen Dateinamen wie die Eingabedatei aber mit der Endung .code anstelle von .txt verwendet (in dieser neuen Datei sollen wir dann die Zeichenkette durch Addition von Zufallszahlen zum jeweiligen ASCII-Code codieren) Zeichen, wenn Sie interessiert waren). Als Anfänger in der Programmierung bin ich mir nicht ganz sicher, wie ich das machen soll. Ich benutze das folgende Stück Code, um zuerst die Eingabedatei zu erhalten:
%Vor%Ich gehe davon aus, eine neue Datei zu erstellen, die ich benutze:
%Vor%Aber ich werde nicht wissen, was der Dateiname ist, bis der Benutzer es eingibt, also kann ich "test.txt" nicht sagen. Wenn jemand weiß, wie man diese Erweiterung ändert, wenn ich eine neue Datei erstelle, würde ich es sehr schätzen!
Dafür gibt es verschiedene Ansätze.
Sie können den super faulen Ansatz wählen und nur den Dateinamen und nicht die Erweiterung .txt eingeben. In diesem Fall können Sie .txt anhängen, um die Eingabedatei zu öffnen.
%Vor%Dann rufst du einfach
an %Vor%Der nächste Ansatz wäre, den gesamten Dateinamen einschließlich der Erweiterung zu übernehmen und einfach .code an ihn anzuhängen, damit Sie test.txt.code haben.
Es ist ein wenig mehrdeutig, ob das akzeptabel ist oder nicht.
Schließlich können Sie std::string
methods find
und replace
, um den Dateinamen ohne Erweiterung zu erhalten und diesen zu verwenden.
Natürlich, wenn dies keine Hausaufgaben wären, sondern ein reales Projekt, würden Sie wahrscheinlich selbst - wie auch andere Leute, die Ihren Code lesen - einen Gefallen tun, indem Sie Boost.Filesystem replace_extension()
, anstatt selbst zu rollen. Es gibt einfach keine Funktionalität, die einfach genug ist, dass Sie zumindest in einem bestimmten Fall keinen Fehler finden könnten.
Nicht zu verraten, denn Lernen ist der Kernpunkt der Übung, aber hier ist ein Hinweis.
Sie werden wahrscheinlich eine Kombination aus find_last_of
und replace
.
Hier sind ein paar Hinweise. Sie haben einen Dateinamen bereits eingegeben - was Sie tun möchten, ist der Teil des Dateinamens, der die Erweiterung nicht enthält:
%Vor%Nachdem Sie diese Funktion geschrieben haben, können Sie sie verwenden, um den Namen der neuen Datei zu erstellen:
%Vor%In Windows (zumindest) können Sie _splitpath verwenden, um den Basisnamen aus der Rest der Stücke, und dann wieder zusammenfügen mit Ihrem Lieblings-String-Formatierer.
Ich würde einfach ".code" an den Dateinamen anhängen, den der Benutzer eingegeben hat. Wenn sie "test.txt" eingeben, lautet die Ausgabedatei "test.txt.code". Wenn sie einen Dateinamen ohne Erweiterung eingeben, wie "test", lautet die Ausgabedatei "test.code".
Ich benutze diese Technik die ganze Zeit mit Programmen, die Ausgabedateien und eine Art von Protokollierungs- / Diagnoseausgaben erzeugen. Es ist einfach zu implementieren und macht meiner Meinung nach die Beziehungen zwischen den Dateien viel expliziter.
Sie müssen den ursprünglichen Dateinamen in eine neue Variable kopieren, in der Sie die Erweiterung ändern können. Etwas wie das:
%Vor%Es ist möglich, dass Sie die Variable "filename" verwenden können, wenn Sie den ursprünglichen Dateinamen nicht für die spätere Verwendung behalten müssen. In diesem Fall könnten Sie einfach verwenden:
%Vor%Der Schlüssel ist, die Definition der C ++ - String-Klasse zu betrachten und zu verstehen, was jede Member-Funktion macht. Wenn Sie rfind verwenden, wird rückwärts durch die Zeichenfolge gesucht, und Sie werden nicht versehentlich auf Erweiterungen in Ordnernamen stoßen, die Teil des ursprünglichen Dateinamens sein könnten (z. B. "C: \ MyStuff.School \ MyFile.txt"). Wenn Sie mit den Offsets von find, rfind usw. arbeiten, sollten Sie auch darauf achten, sie richtig zu verwenden, wenn Sie sie an andere Methoden übergeben (zB verwenden Sie assign (Dateiname, 0, extPos-1), zuweisen (Dateiname, 0, extPos), zuweisen (Dateiname, 0, extPos + 1)).
Ich hoffe, das hilft.
Tags und Links c++ encoding file-extension