C++ Datei kopieren und gewisse Textpassagen tauschen bzw. ersetzen

Status
Für weitere Antworten geschlossen.

rasidrasid

Cadet 3rd Year
Registriert
Apr. 2014
Beiträge
55
Hallo,

ich habe etwas probiert, doch bin ich nicht weiter gekommen. Ich würde gerne eine Textdatei Zeile für Zeile in eine neue Datei kopieren, doch gewisse Passagen würde ich ersetzen wollen. Diese Sachen wären Angaben, die zum Teil abgeschnitten werden sollen.
Diese Passage sähe so aus:
alte Dateipassage: File=/../../mein_file.txt
neu sollte es so aussehen: File=mein_file.txt

Es muss vorher geprüft werden ob gleich nach dem File= ein Text kommt. Wenn ja, dann soll es bleiben. Wenn nein, dann sollte nach dem = bis zu einem Buchstaben weggeschnitten werden.

Bitte wie bekomme ich das und das Dateikopieren (Zeile für Zeile) in einem Code hin?

Danke
 
Wenn du unter .NET bist:
http://msdn.microsoft.com/de-de/lib...der?cs-save-lang=1&cs-lang=cpp#code-snippet-2

Code:
using namespace System;
using namespace System::IO;
int main()
{
   try
   {
      // Create an instance of StreamReader to read from a file.
      StreamReader^ sr = gcnew StreamReader( "TestFile.txt" );
      try
      {
         String^ line;

         // Read and display lines from the file until the end of 
         // the file is reached.
         while ( line = sr->ReadLine() )
         {
            Console::WriteLine( line );
         }
      }
      finally
      {
         if ( sr )
            delete (IDisposable^)sr;
      }
   }
   catch ( Exception^ e ) 
   {
      // Let the user know what went wrong.
      Console::WriteLine( "The file could not be read:" );
      Console::WriteLine( e->Message );
   }
}

Mit "line" hast du ja jede Zeile einzeln vorliegen, da sollte es mit den jeweiligen string Methoden ganz einfach sein.

Check ob "File=" vorhanden ist, wenn ja zählen an welcher Stelle das erste "/" ist (wenn nichts kommt, einfach mit der nächsten Zeile weiter machen) dann checken wo das letzte "/" ist und nun hast du ja den Start und Endpunkt für die Entfernenmethode.
 
Zuletzt bearbeitet:
Hallo Shio.

Danke für die Antwort. Funktioniert das auch wenn ich ganz einfach unter Linux mit g++ compiliere? Da ist vieles neu :p
Danke
 
Geht es dir darum das Problem zu lösen oder darum, es mit C++ zu lösen? Das wäre mit einem Shell-Script leichter zu bewerkstelligen.
 
Es sollte mit c++ sein. Einiges für mein Programm (c++) habe ich schon. Das konnte ich noch nicht bewerkstelligen.

PS: Wie sähe ein Shellskript denn dazu aus? :evillol:

Danke
 
Ist es wirklich zuviel verlangt 1 Minute zu googeln? Hier kann man z.B. sehen wie man mit standard c++ einzelne Passagen in Textfiles ersetzten kann und seit c++11 (bzw. davor in Boost) kann man sogar reguläre Ausdrücke verwenden (siehe z.B. Hier).
Falls das nicht reicht um ein funktionierendes Programm zu schreiben, dann poste mal deinen Code. Allerdings würde ich solche Fragen generell eher auf Stackoverflow stellen.
 
Ganz grob und nur happy path getestet.
Code:
#!/bin/bash

if [[ -z $1 ]] || [[ ! -f $1 ]]; then
        echo "Illegal argument passed: $1"
        exit 3
fi

while read line; do
        if [[ $line =~ "File=/" ]]; then
                echo $line | sed 's%/..%%g' >> output.txt
        else
                echo $line >> output.txt
        fi
done < $1
Musst du halt noch anpassen, falls die output file auch dynamisch sein soll. Ansonsten eben aufrufen mit ./<scriptName> <fileName>
 
War wohl schon zu spät zum Denken. Jedenfalls geht das noch kompakter.
Code:
sed 's%File=\(/\.\.\)\+/%File=%g' < testSrc.txt > output.txt
Verursacht wesentlich weniger sed-Aufrufe.
 
Danke :D

Und mit c++? Mit dem Skript ist es natürlich auch eine Lösung, da ich sicherlich per system-call sed aufrufen kann. Aber wie würde es mit direkter c++-Programmierung aussehen.

Danke
 
Hast du dir Miuwas Beitrag überhaupt angeguckt? Ne Datei mit C++ lesen und schreiben ist wirklich sehr sehr einfach und sollte auch nen Anfänger schaffen.
Wo hakts denn?
Du könntest dein Programm auch in 2 Stufen schreiben: Erstmal kopierst du die Datei unverändert und erstellst einen Klon. Anschließend schreibst du eine weitere Funktion die diese geklonte Datei zeilenweise durchgeht und einen Filter (regex hat Tumbleweed ja schon geliefert) anwendet.
http://www.cplusplus.com/reference/regex/
 
Zuletzt bearbeitet:
Shio hat dir doch einen Lösungsansatz geboten. Das ist zwar nicht direkt reines C++, aber wenn du den Code mal ein paar Minuten studierst und verstehst, ist es auch kein Teufelswerk, das in C++ zu übertragen.

Alternativ ... seit C++11 unterstützt C++ auch von Haus aus regular expressions ( http://www.cplusplus.com/reference/regex/ ). Damit könntest die regex, die Tumbleweed da für sed gepostet hat (mit einigen Abwandlungen) auch direkt in C++ nutzen.
 
Tut mir leid, wenn ich gestern Abend etwas unfreundlich war, aber wenn du ein vernünftiger C++ Programmierer werden willst, dann solltest du auf jedenfall lernen im Internet nach Lösungen für deine Problem zu suchen. In den meisten Fällen wirst du nicht der Erste sein, der eine bestimmte Funktion implementieren muss.

Wie dem auch sei, wenn man mal die ganz Fehlerbehandlung und User-Interaktion außen vor lässt, dann könnte das in C++ z.B. so aussehen:

Code:
#include<fstream>
#include<string>
#include<regex>

using namespace std;

int main() {		
	ifstream fin ("C:\\FileIn.txt");
	ofstream fout("C:\\FileOut.txt");
	
	regex matchex("File=(/..)*/");
	string repstr("File=");

	string str;
	while (!fin.eof())	{
		getline(fin, str);
		str = regex_replace(str, matchex, repstr);
		fout << str << endl;
	}	
}
bzw. etwas kompakter:

Code:
int main() {		
	ifstream fin ("C:\\FileIn.txt");
	ofstream fout("C:\\FileOut.txt");

	string str;
	while (!fin.eof())	{
		getline(fin, str);
		fout << regex_replace(str, regex("File=(/..)*/"), "File=") << endl;
	}
}

Gibt eigentlich keinen Grund, warum man hier auf .net zurückgreifen müsste.
 
Ich sehe hier null Eigenleistung. Das ist hier kein Programmier-Service ala "Ich hab folgendes Problem, wie sieht der Code dazu aus".
 
Hallo Miuwa,

ich danke Dir. Ich muss es verstehen, aber das hilft mir. Vielen Dank.

@Green Mamba
Ich muss mal da mal da programmieren und werde bei meinem Alter sicherlich kein reiner Programmierer. Ich habe die Mentalität von Foren immer als Hilfe verstanden. In der Zeit was ich für diesen Beitrag investiert habe, hätte ich es als reiner Programmierer selbst vielleicht auch gefunden. Wenn man arbeitet und schnelle Hilfe braucht, dann hofft man halt auf Foren. Wenn es hier Hilfreiche Codeblöcke gibt, dann sind das Hilfen wie aus einer Formelsammlung, die man dann für immer hat. Es ist uncool wenn man mehr als der Andere weiß und es dann weniger schön "heraushängen" lässt.

Danke
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben