C++ | Zeilenumbruch im fstream

Hallo liebe www-Gemeinde.
Ich muss gestehen, dass ich nich so erfahren in C++ bin.
Zu meinem Problem. Ich moechte eine sehr simple Textverschluesselung schreiben, die eine txt-Datei einliest, und eine verschluesselte Version erzeugt.

Hier erstmal mein Code:

#include
using namespace std;

#include
using namespace std;

#include
using std::string;

#include
using namespace std;

void bearbeite(vector& be, int lauf) {
for (int j=0; j& be, int lauf) {
for (int j=0; j StringV(1);
int i=1;

string Inputfile;
string Outputfile;
string INPfile;
string OUTPfile;

cout > Inputfile;
INPfile="…Desktop\"+Inputfile+".txt";
cout > Outputfile;
OUTPfile="…\Desktop\"+Outputfile+".txt";
cout > code;

if (code == „v“) {
bearbeite(StringV, i);
}
else {
encode(StringV, i);
}

int index=1;
while(index

Hallo

Ich habe dir das mal ein wenig aktualisiert, s.u. Dekodiert wurde bei mir nicht einwandfrei, da musst du noch ein wenig tuefteln. Ein Hinweis:

encode = verschluesseln
decode = entschluesseln

wie kann ich zeilenumbrüche im ifstream erfassen und das problem lösen?

Im ifstream gar nicht, die getline() macht das. Beim Schreiben der Datei mit "

#include
#include
#include
#include
// das hier einmal genuegt:
using namespace std;

void bearbeite(vector& be) {
for (int j=0; j& be) {
for (int j=0; j> Inputfile;
cout > Outputfile;
cout StringV;
// Mein Problem ist nun: Ich möchte jede Zeile des Textinputs in ein
// Element des String-Vektors StringV speichern.
int i;
string line; // temporaerer string
for(i=0; Input.good(); i++) { // .good()
getline(Input, line); // erst kriegen
StringV.push_back(line); // dann hinten anhaengen
}

char wasTun;
cout > wasTun;

if (wasTun == „v“) {bearbeite(StringV);}
else {entschluesseln(StringV);}

// Zeilende so:
for (i=0; i

wie kann ich zeilenumbrüche im ifstream erfassen und das problem lösen?

Im ifstream gar nicht, die getline() macht das. Beim Schreiben
der Datei mit "

Hi!

Vielen Dank für deine Hilfe…klappt super jetzt.
*chen von mir dafür!

mfG
Stefan

Hallo Stefan

Ich muss gestehen, dass ich nicht so erfahren in C++ bin.

OK

Zu meinem Problem. Ich moechte eine sehr simple
Textverschluesselung schreiben, die eine txt-Datei einliest,
und eine verschluesselte Version erzeugt.
Hier erstmal mein Code:

Das Problem wurde ja schon von Anderen hier
hinreichend bearbeitet, ich würde lediglich
anmerken wollen, daß es in solchen Fällen
nicht die günstigste Lösung ist, „zeilenweise“
zu arbeiten. Besser wäre, die Datei „byteweise“
direkt in einen std::vector zu
verwandeln, die Operationen durchzuführen und den
std::vector direkt wieder zurückzuschreiben.

Ich hab das mal in Ansätzen entworfen, vielleicht
nützt es ja noch was für das C+±Studium.

Grüße

CMБ

#include // fuer transform()
#include // stream\_iterator
#include // cout, cin
#include // ifstream, ofstream
#include // daten
#include // Dateinamen

using namespace std;

// Klasse, die ein "Funktionsobjekt fuer En/Dekodierung bereitstellt
class MyCoder {
 private:
 int f, i; 
 public: // Initialisierung mit z.B. f = 3, dann ch = ch + 3\*i
 MyCoder(int wert) : f(wert), i(0) { } // oder -3, ch = ch - 3\*i
 unsigned char operator() (unsigned char& c) { return c + f \* i++; }
};

// Datei zu vector
int file\_to\_vector(const string& fn, vector& data);
// vector zu Datei 
int vector\_to\_file(const vector& data, const string& fn);

 int main() 
{
 string fnEingabe, fnAusgabe;
 cout \> fnEingabe;
 cout \> fnAusgabe;
 
 vector daten;
 file\_to\_vector(fnEingabe, daten);
 cout \> was;
 if(was == 'e') 
 transform(daten.begin(), daten.end(), daten.begin(), MyCoder(3));
 else if(was == 'd')
 transform(daten.begin(), daten.end(), daten.begin(), MyCoder(-3));

 vector\_to\_file(daten, fnAusgabe);
 cout & data)
{
 ifstream infile(fn.c\_str(), ios::binary);
 infile \>\> noskipws;
 copy(istream\_iterator(infile), 
 istream\_iterator(), back\_inserter(data));
 infile.close();
 return data.size();
}
// Vektor Zeichenweise in Datei verwandeln
 int vector\_to\_file(const vector& data, const string& fn)
{
 ofstream outfile(fn.c\_str(), ios::binary);
 copy(data.begin(), data.end(), ostream\_iterator(outfile));
 outfile.close();
 return data.size();
}

Das Problem wurde ja schon von Anderen hier
hinreichend bearbeitet, ich würde lediglich
anmerken wollen, daß es in solchen Fällen
nicht die günstigste Lösung ist, „zeilenweise“
zu arbeiten. Besser wäre, die Datei „byteweise“
direkt in einen std::vector zu
verwandeln, die Operationen durchzuführen und den
std::vector direkt wieder zurückzuschreiben.

Ehrlich gesagt ist das eher keine so gute Idee. Besser ist es, den Datenstrom Stück für Stück zu verarbeiten - vielleicht nicht zeilenweise, sondern in irgendeiner Blockung. Schließlich könnte die Datei ja auch mal ein Gigabyte groß sein.

Viele Grüße,
Sebastian

Hallo

Besser wäre, die Datei „byteweise“
direkt in einen std::vector zu
verwandeln, die Operationen durchzuführen und den
std::vector direkt wieder zurückzuschreiben.

Ehrlich gesagt ist das eher keine so gute Idee. Besser ist es,
den Datenstrom Stück für Stück zu verarbeiten - vielleicht
nicht zeilenweise, sondern in irgendeiner Blockung.
Schließlich könnte die Datei ja auch mal ein Gigabyte groß
sein.

Naja, das ist schon möglich, aber bei der hier
vorgestellten Problematik eher äußerst unwahr-
scheinlich, immerhin ging es darum „Text“ „zei-
lenweise“ einzulesen.
Z.B. hat das Gesamtwerk von Nietzsche ca.
15 MB, diese durch obiges Programm zu
wursteln dauert ~1 Sekunde.

Das von mir vorgestellte Programm sollte eher
die Verwendung von STL-Algorithmen und von
Funktionsobjekten für einen C+±Anfänger
aufzeigen.

Grüße

CMБ

Hallo Sebastian

wie kann ich zeilenumbrüche im ifstream erfassen und das problem lösen?

Im ifstream gar nicht, die getline() macht das. Beim Schreiben
der Datei mit "

const char e = ‚\n‘;

Das würde auch für Linux passen. Wenn die Quellen dann jemand für Apple verwenden will, muss er sich halt das \r da einfügen.

Als OOP-Mensch (OOP == Bequemlichkeit) würde ich so sagen:

FileOutText tf;
FileOutBin bf;
FileInText ti;
FileInBin bi;

Jetzt steckt man Zeilen da rein (Text), die dann je nach System behübscht werden. Natürlich mit einem Bäumchen für Stream, StreamIn, StreamOut etc. Ich kriege ja mit fstream & Co. nur das Kopfschütteln. Vergleiche das mal mit Datei-Sachen von anderen Libs, wie einfach das dort geht.

lG
Martin B

Besser wäre, die Datei „byteweise“
direkt in einen std::vector zu
verwandeln

Ehrlich gesagt ist das eher keine so gute Idee. Besser ist es,
den Datenstrom Stück für Stück zu verarbeiten

Das von mir vorgestellte Programm sollte eher
die Verwendung von STL-Algorithmen und von
Funktionsobjekten für einen C+±Anfänger
aufzeigen.

Dafür war’s ganz gut, glaube ich :smile:. Und klar, bei einem Spaßprogramm ist’s egal. Ich wollte nur die oben u.U. herauslesbare Aussage, dass komplettes Einlesen irgendwie „besser“ sei, nicht so stehen lassen.

Viele Grüße,
Sebastian