Zum Inhalt springen

istringstream


RoflCopter

Empfohlene Beiträge

Hallo Community,

nach mehr oder wenig kurzer Suche ( google ) bin ich auf einen Beitrag von diesem Forum gefunden, wie man einen String zu einem Integer umwandeln kann ( C++ )

Dies soll mit "istringstream" funktionieren, ich habe mir das Bsp. welches ich unter der Sufu gefunden habe bei Seite genommen und mal selber ausprobiert. Dennoch scheint mein Programm nicht zu funktionieren.

Ich habe die Aufgabe ein Programm in C++ zu schreiben, welches aus einer .txt Datei komplette Zeilen einliest.

Diese Zeile soll dann anhand der vorhandenen Trennzeichen ';' in Substrings gesplittet werden.

Die 3 Substrings lauten:

p = pfad

dn = dateiname

op = operator

Anhand des Operators soll eine Aktion ausgeführt werden - Löschen oder Kopieren.

Eventuelles Errorhandling steht noch nicht auf dem Plan.

Das Problem ist, dass der gewünschte Effekt sprich: Datei kopiert oder Datei gelöscht nicht eintritt.

Beispiel zum Inhalt der . txt Datei:

D:\Test\;hallo_welt.txt\;2

Anbei der Quellcode

#include <iostream>

#include <fstream> 

#include <string> 

#include <windows.h>

#include <stdlib.h>

#include <sstream>


using namespace std;


void fc_copyfile(string in, string out);

void fc_append ();

void fc_action();

void fc_com ();



// global


string p, dn, pad, gz, token;

stringstream ss (token, istringstream::in | istringstream::out);

int op;

ofstream log;



int main() {


	fc_com();


	int i = 0;

	int a = 0;


	ifstream csv;




	log.open("Logfile.txt", ios::trunc, ios::binary);

	log << "Logfile created" << endl;


	csv.open("csv.txt", ios::binary);


	if(!csv) {

		log << "csv.txt not found." << endl;

		csv.close();

		log.close();

		exit (1);

	}







		while (!csv.eof()){


			getline(csv, gz);

			i = 0;

			a = 0;



			int e = gz.find(";", a);


			while ( e > 0) {


				token = gz.substr(a, e-a);

				a = e + 1;		


				e = gz.find(";", a);

				i++;


				switch(i) {

					case 1 : p = token;

					break;

					case 2 : dn = token;

					break;

					case 3 : ss << token;

							 ss >> op;



					break;

					default: log << "Operator unknown!" << endl;



				}


				token = gz.substr(a);

			}	


		fc_append();

		fc_action();


		}


	log << "Finished" << endl;


	csv.close();

	log.close();



	system("PAUSE");

	return 0;


}








void fc_action () { // copy or delete


	switch (op) {


		case 1 : fc_copyfile(dn, pad);

				 log << dn << " copied" << endl;

		case 2 : BOOL WINAPI DeleteFile( __in  LPCTSTR pad);

				 log << dn << " deleted" << endl;

		default : log << "Operator unknown!" << endl;


	}


}




void fc_copyfile(string in, string out) { // copy char by char ( binary mode )


	ifstream inp;

	ofstream outp;


	char c;


	inp.open(in.c_str(), ios::binary);

	outp.open(out.c_str(), ios::binary);


	while(inp.get(c) && !inp.eof()){

		outp.put(c);


	}

}




void fc_append () {  // copy content of p to pad, append dn at pad ( p + dn )


	pad = p;

	pad += dn;


}




void fc_com () {  // text


	cout << "Copy and Delete" << endl;

	cout << "Read the Logfile.txt for further details" << endl;


}

Ich danke im Voraus für eure Hilfe.

P.S.: Sorry fürs falsche Forum - ist mit gerade eben erst aufgefallen! Bitte verschieben.

Bearbeitet von RoflCopter
Falsches Forum
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • Du brauchst dich nicht mit find und substr herumzuschlagen. getline kann aus jedem Stream lesen, also auch aus einem Stringstream. Du kannst ein eigenes Trennzeichen angeben, also auch ';'.
  • Du brauchst keine WinAPI-Funktion, um eine Datei zu löschen. std::remove aus <cstdio> tut das gleiche. Zudem hast du da keinen Funktionsaufruf, sondern eine Wiederholung der Funktionsdeklaration.
  • Das Kopieren Zeichen für Zeichen ist auch nicht besonders effizient. Du kannst einfach dein Streambuffer des Eingabestreams (daran kommst du mit de rdbuf-Methode) mit dem << Operator auf den Ausgabestream schicken.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Klotzkopp,

danke dir für deine Antwort. Den Part mit dem "remove" konnte ich relativ zügig lösen.


		case 2 : if(!outp) {

					log << dn << " not found, can't delete the file." << endl; 

				 } 


				 else {

					remove(pad.c_str());

					log << dn << " deleted" << endl;

				 }

Allerdings macht mir der Part mit "rdbuf" etwas zu schaffen, trotz google und msdn - es scheint mir so als ob rdbuf eine Umleitung ist? Quelle: basic_ios::rdbuf

// basic_ios_rdbuf.cpp

// compile with: /EHsc

#include <ios>

#include <iostream>

#include <fstream>


int main( ) 

{

   using namespace std;

   ofstream file( "rdbuf.txt" );

   streambuf *x = cout.rdbuf( file.rdbuf( ) );

   cout << "test" << endl;   // Goes to file

   cout.rdbuf(x);

   cout << "test2" << endl;

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke dir, hätte nicht gedacht, dass es so einfach zu realisieren ist :)

Konnte den Beitrag leider nicht editieren, entschuldigt bitte den Doppelpost.

Ich habe die Sache mit dem rdbuf einfach realisieren können, das mit dem remove auch. Allerdings kopiert bzw. löscht das Programm nicht wie gewünscht die Dateien. Ich habe es im Debugger geprüft, alle Variablen beinhalten den gewünschten String bzw. Wert.

Ich habe zur Sicherheit eine Variable Test hinzugefügt um sicher gehen zu können, dass es nicht am Operator liegt.

Anbei der Code.

#include <iostream>

#include <fstream> 

#include <string> 

#include <windows.h>

#include <stdlib.h>

#include <sstream> // token to op

#include <cstdio> // remove 



using namespace std;



void fc_copyfile(string dn, string pad);

void fc_append ();

void fc_action();

void fc_com ();



// global

string p, dn, pad, gz, token;

stringstream ss (token, istringstream::in | istringstream::out);

int op;

ofstream log, outp;

ifstream inp;




int main() {


	fc_com();


	int i = 0;

	int a = 0;


	ifstream csv;


	// Filestream Log-File

	log.open("Logfile.txt", ios::trunc, ios::binary); // finish

	log << "Logfile wurde erstellt." << endl;


	// Filestream csv-File

	csv.open("csv.txt", ios::binary);


	// Errorhandling csv-File

	if(!csv) {

		log << "CSV-Datei nicht gefunden!" << endl;

		csv.close();

		log.close();

		cout << "CSV-Datei nicht gefunden!" << endl;

		system("PAUSE");

		exit (1);

	}



		while (!csv.eof()){


			getline(csv, gz);

			i = 0;

			a = 0;



			int e = gz.find(";", a);


			while ( e > 0) {


				token = gz.substr(a, e-a);

				a = e + 1;		


				e = gz.find(";", a);

				i++;


				switch(i) {

					case 1 : p = token;

					break;

					case 2 : dn = token;

					break;

					case 3 : ss << token;

							 ss >> op;



					break;

					default: log << "Operator unbekannt!" << endl;



				}


				token = gz.substr(a);

			}	


		fc_append(); // String aneinander hängen

		fc_action(); // Löschen oder Kopieren


		}



	// Ausgabe Kommandobox

	cout << "Erfolgreich" << endl;

	log << "Erfolgreich" << endl;


	// Filestreams schließen

	csv.close();

	log.close();



	system("PAUSE");

	return 0;


}






void fc_action () {



	int test = 1; // zum Testen


	switch (test) { // << Hier normalerweise op


		case 1 : if(!inp) {

					log << dn << " konnte nicht gefunden werden." << endl;

				 }


				 else {

					fc_copyfile(dn, pad);

					log << dn << " 1.copyfile wurde kopiert" << endl;

				 }

				 break;



		case 2 : if(!outp) {

					log << dn << " konnte nicht gefunden werden." << endl; 

				 } 


				 else {

					remove(pad.c_str());

					log << dn << " 2.remove wurde gelöscht" << endl;

				 }

				 break;


		default : log << op << " Operator unbekannt!" << endl;


	}


}




void fc_copyfile(string dn, string pad) {



  ofstream outp;

  ifstream inp;


  // Filestreams öffnen

  inp.open(dn.c_str(), ios::binary);

  outp.open(pad.c_str(), ios::binary);


  // Datei kopieren

  outp << inp.rdbuf();


  // Filestreams schließen

  outp.close();

  inp.close();


}



void fc_append () { // String aneinander hängen


	pad = p;

	pad += dn;


}




void fc_com () { // Text Kommandobox


	cout << "Kopieren und Löschen" << endl;


}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Werde erst einmal die globalen Variablen los. Erstens ist das kein guter Stil, halte deine Variablen immer so lokal wie möglich. Zweitens ist es nicht gut, denselben fstream für mehrere Dateien zu "recyclen". Der Status des Streams wird nämlich nicht automatisch zurückgesetzt.

Du brauchst übrigens Streams nicht manuell zu schließen, das passiert automatisch, wenn sie aus dem Scope laufen. Ein weiterer Vorteil von lokalen Variablen. Der Aufruf von open ist auch unnötig, dafür haben die Streamklassen Konstruktoren:

void fc_copyfile(string dn, string pad) {

ofstream outp(dn.c_str(), ios::binary);
ifstream inp(pad.c_str(), ios::binary);

// Datei kopieren
outp << inp.rdbuf();
}[/code]

Tut dasselbe wie deine Funktion, ist aber irgendwie kürzer, oder? ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich war ebenfalls der Meinung, dass ich die Streams nicht manuell zu schließen bzw. zu öffnen brauche - aber meine Mitarbeiter waren da anderer Meinung - haben es als schlechten Stil angesehen ( ich bin Azubi im 2. LJ )

Schonmal danke für deine Hilfe, ich werde mich nun darum kümmern die globalen Variablen weg zu bekommen ;)

Edit: Wie sieht es mit den Filestreams wie "log" aus - sollte ich diese auch lokal verwenden oder global?

Bearbeitet von RoflCopter
s.o.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich war ebenfalls der Meinung, dass ich die Streams nicht manuell zu schließen bzw. zu öffnen brauche - aber meine Mitarbeiter waren da anderer Meinung - haben es als schlechten Stil angesehen ( ich bin Azubi im 2. LJ )
Du könntest versuchen, diese Mitarbeiter vorsichtig und höflich über RAII zu informieren.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Eine bescheide Frage aber nun denn..

wenn ich die Variablen nun alle lokal anstatt global verwende, muss ich diese ja auch an die Funktionen übergeben.

Wenn ich allerdings schreibe:

void fc_action ( int op, string dn, string pad ); // Funktionsprototyp

und beim Funktionsaufruf fc_action(); schreibe spuckt der Compiler mir die Meldung aus, dass fc_action(); "Akzeptiert keine 0 Argumente" - daraus lässt sich schließen, dass ich die Variablen auch in den Funktionsaufruf schreiben müsste also:

fc_action ( int op, string dn, string pad );

Aber auch da meckert er mit Fehler "error C2660: 'fc_action': Funktion akzeptiert keine 0 Argumente"

Ich weiß, dass das eine relativ lächerliche Frage ist - aber die Ausbildungsumstände sind nicht gerade gut da mir u.a. keine Fragen beantwortet werden - danke vorab für eure Hilfe.

Edit: Habe es glaub ich selber rausgefunden - beim Funktionsaufruf muss man den Datentyp nicht mit angeben.

Bearbeitet von RoflCopter
s.o.
Link zu diesem Kommentar
Auf anderen Seiten teilen

void fc_action ( int op, string dn, string pad ); // Funktionsprototyp

und beim Funktionsaufruf fc_action(); schreibe spuckt der Compiler mir die Meldung aus, dass fc_action(); "Akzeptiert keine 0 Argumente"

richtig, ein int und zwei strings müssen übergeben werden

daraus lässt sich schließen, dass ich die Variablen auch in den Funktionsaufruf schreiben müsste also:

fc_action ( int op, string dn, string pad );

Aber auch da meckert er mit Fehler "error C2660: 'fc_action': Funktion akzeptiert keine 0 Argumente"

Das ist wieder eine Funktionsdeklaration, versuchs mal ohne die Typen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

richtig, ein int und zwei strings müssen übergeben werden

Das heißt dann, dass meine Funktion mit einer Kopie arbeitet?

Das ist wieder eine Funktionsdeklaration, versuchs mal ohne die Typen.

Hat geklappt danke - ist es möglich Filestreams zu übergeben? Der Compiler hat mir als ich in der Deklaration fc_action ( int op, string dn, string pad, ofstream log );

hatte massiv gemeckert.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das heißt dann, dass meine Funktion mit einer Kopie arbeitet?
Richtig.

Hat geklappt danke - ist es möglich Filestreams zu übergeben? Der Compiler hat mir als ich in der Deklaration fc_action ( int op, string dn, string pad, ofstream log );

hatte massiv gemeckert.

Streams können nicht kopiert werden, daher klappt das so nicht. Deklarier den ofstream-Parameter als Referenz:

fc_action ( int op, string dn, string pad, ofstream& log );

Am Aufruf ändert sich nichts.

Link zu diesem Kommentar
Auf anderen Seiten teilen

fc_action ( int op, string dn, string pad, ofstream& log );

Am Aufruf ändert sich nichts.

So habe ich es getan, allerdings verlangt der Compiler ein weiteres Argument beim Funktionsaufruf.

Das ursprüngliche Problem, das die Dateien nicht kopiert bzw. gelöscht werden bleibt allerdings fortbestehen.

Gibt es eine Möglichkeit etwaige Fehler(codes) in einer Variable zu speichern und diese dann anzeigen zu lassen?

Beispielsweise "noAccess" oder so, so dass ich meine Funktionen durchtesten kann wo es hapert. Denn der Compiler meckert nicht.

Ich habe etwas von Exeptions gelesen, denke allerdings nicht, dass ich damit auf dem richtigen Weg bin.

Bearbeitet von RoflCopter
Rechtschreibung :P
Link zu diesem Kommentar
Auf anderen Seiten teilen

So habe ich es getan, allerdings verlangt der Compiler ein weiteres Argument beim Funktionsaufruf.
Natürlich musst du dann auch ein Stream-Objekt mitgeben. Ich meinte, beim Aufruf gibt es keinen sichtbaren Unterschied zwischen Value- und Referenzparametern.

Das ursprüngliche Problem, das die Dateien nicht kopiert bzw. gelöscht werden bleibt allerdings fortbestehen.
Zeig bitte den aktuellen Code.

Gibt es eine Möglichkeit etwaige Fehler(codes) in einer Variable zu speichern und diese dann anzeigen zu lassen?

Remove hat immerhin einen Rückgabewert, den könntest du ausgeben. Und ob das Erstellen der Streams zum Kopieren geklappt hat, könntest du auch ausgeben.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe den aktuellen Code im Debugger laufen lassen und mir ist aufgefallen das die Variable pad ( string ) keinen Inhalt bekommt.

Das aktuelle Ergebnis ist Werk von Testen etc.

#include <iostream>

#include <fstream> 

#include <string> 

#include <windows.h>

#include <stdlib.h>

#include <sstream> // token to op

#include <cstdio> // remove 


using namespace std;


void fc_copyfile(string dn, string pad);

void fc_append (string p, string& pad, string dn);

void fc_action (int op, string dn, string pad, ofstream& log);

void fc_com (void);




int main() {


	string p, dn, pad, gz, token;

	stringstream ss (token, istringstream::in | istringstream::out);


	int op = 0;

	int i = 0;

	int a = 0;


	ifstream csv;




	fc_com();


	// Filestream Log-File

	ofstream log;

	log.open("Logfile.txt", ios::trunc, ios::binary);


	if(log.fail()) {


		cout << "Konnte Logfile.txt nicht erstellen!" << endl;

		cout << "Programm wird beendet..." << endl;

		system("PAUSE");

		exit(1);

	}


	else {

		log << "Logfile wurde erstellt." << endl;

	}




	// Filestream csv-File

	csv.open("csv.txt", ios::binary);


	// Errorhandling csv-File

	if(csv.fail()) {

		log << "CSV-Datei nicht gefunden!" << endl;

		cout << "CSV-Datei nicht gefunden!" << endl;

		system("PAUSE");

		exit (1);

	}



		while (!csv.eof()){


			getline(csv, gz);

			i = 0;

			a = 0;



			int e = gz.find(";", a);


			while ( e > 0) {


				token = gz.substr(a, e-a);

				a = e + 1;		


				e = gz.find(";", a);

				i++;


				switch(i) {

					case 1 : p = token;

					break;

					case 2 : dn = token;

					break;

					case 3 : ss << token;

							 ss >> op;



					break;

					default: log << "Operator unbekannt!" << endl;



				}


				token = gz.substr(a);

			}	


		fc_append(p, dn, pad); // String aneinander hängen

		fc_action (op, dn, pad, log); // Löschen oder Kopieren


		}



	// Ausgabe Kommandobox

	cout << "Erfolgreich" << endl;

	log << "Erfolgreich" << endl;


	// Filestreams schließen

	csv.close();

	log.close();



	system("PAUSE");

	return 0;


}






void fc_action (int op, string dn, string pad, ofstream& log) {


	ifstream inp(dn.c_str(), ios::binary);

	ofstream outp(pad.c_str(), ios::binary);


	switch (op) {


		case 1 : if(inp.fail()) {

					log << dn << " konnte nicht gefunden werden." << endl;

				 }


				 else {

					fc_copyfile(dn, pad);

					log << dn << " wurde kopiert" << endl;

				 }

				 break;



		case 2 : if(!outp) {

					log << dn << " konnte nicht gefunden werden." << endl; 

				 } 


				 else {

					remove(pad.c_str());

					log << dn << " wurde gelöscht" << endl;

				 }

				 break;


		default : log << op << " Operator unbekannt!" << endl;


	}


}




void fc_copyfile(string dn, string pad) {



 ofstream outp(pad.c_str(), ios::binary);

 ifstream inp(dn.c_str(), ios::binary);


 if(inp.fail()) {

	cout << "inp.failed.fc_copyfile" << endl;

 }


 if(outp.fail()) {

	cout << "outp.failed.fc_copyfile" << endl;

 }


 // Datei kopieren

 outp << inp.rdbuf();


}



void fc_append (string p, string& pad, string dn) { // String aneinander hängen


	pad = p;

	pad += dn;


}




void fc_com (void) { // Text Kommandobox


	cout << "Kopieren & Loeschen" << endl;


}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Klotzkopp,

danke dir für die Antwort - es funktioniert nun immerhin zu einem Teil. :)

Die Erste eingelesene Zeile meiner .txt Datei wird korrekt ausgeführt, alle danach folgenden Zeilen werden fehlerhaft interpretiert.

So wird z.B. in der .txt Datei angegeben durch den Operator "2" das die Datei gelöscht werden soll, dies passiert allerdings bei der Ersten Zeile ( wo es korrekt ist ) - aber auch alle nachstehenden Dokumente welche sich an

anderen Orten befinden werden gelöscht

( es wird zumindest versucht, da es diese Dateien nicht gibt, da diese eigentlich erst dort hin kopiert werden )

Wenn ich allerdings in der Ersten Zeile den Operator "1" für Kopieren verwende, versucht er sämtlichen nachfolgenden Zeilen ebenfalls zu kopieren. Welche im Ordner allerdings nicht existieren ( Zielordner ).

Danke vorab für eure Hilfe.

Edit: Ich werde den Code gleich anhängen.

#include <iostream>

#include <fstream> 

#include <string> 

#include <windows.h>

#include <stdlib.h>

#include <sstream> // token to op

#include <cstdio> // remove 


using namespace std;


void fc_copyfile(string dn, string pad);

void fc_append (string p, string& pad, string dn);

void fc_action (int op, string dn, string pad, ofstream& log);

void fc_com (void);




int main() {


	string p, dn, pad, gz, token;

	stringstream ss (token, istringstream::in | istringstream::out);


	int op = 0;

	int i = 0;

	int a = 0;	


	// Filestream Log-File

	ofstream log;

	log.open("Logfile.txt", ios::trunc, ios::binary);


	if(log.fail()) {


		cout << "Konnte Logfile.txt nicht erstellen!" << endl;

		cout << "Programm wird beendet..." << endl;

		system("PAUSE");

	}


	else {

		log << "Logfile wurde erstellt." << endl;

	}



	// Filestream csv-File

	ifstream csv("csv.txt", ios::binary);


	fc_com();


	// Errorhandling csv-File

	if(csv.fail()) {

		log << "CSV-Datei nicht gefunden!" << endl;

		cout << "CSV-Datei nicht gefunden!" << endl;

		system("PAUSE");

		exit (1);

	}



	// Einlesen von Zeile ( gz ) von csv, anschließend werden anhand ';' Tokens erstellt

		while (!csv.eof()){



			i = 0;

			a = 0;


			getline(csv, gz);


			int e = gz.find(";", a);


			while ( e > 0) {


				token = gz.substr(a, e-a);

				a = e + 1;		


				e = gz.find(";", a);

				i++;


				switch(i) {

					case 1 : p = token;

					break;

					case 2 : dn = token;

					break;

					case 3 : ss << token;

							 ss >> op;



					break;

					default: log << "Operator unbekannt!" << endl;



				}


				token = gz.substr(a);

			}	


		fc_append(p, pad, dn); // String aneinander hängen

		fc_action (op, dn, pad, log); // Löschen oder Kopieren


		}



	// Ausgabe Kommandobox

	//cout << "Erfolgreich" << endl;

	//log << "Erfolgreich" << endl;



	system("PAUSE");

	return 0;


}






void fc_action (int op, string dn, string pad, ofstream& log) {



	switch (op) {


		case 1 : if(pad.c_str()) {


					fc_copyfile(dn, pad);

					log << dn << " wurde kopiert" << endl;


				 }


				 else {


					 log << dn << " Error.case1_op" << endl;


				 }

				 break;



		case 2 : if(pad.c_str()) {


					remove(pad.c_str());

					log << dn << " wurde gelöscht" << endl;	


				 } 

				 else {


					log << dn << " Error.case2_op" << endl; 				


				 }	


				 break;


		default : log << op << " Operator unbekannt!" << endl;


	}


}




void fc_copyfile(string dn, string pad) {



 ofstream outp(pad.c_str(), ios::binary);

 ifstream inp(dn.c_str(), ios::binary);


 if(inp.fail()) {

	cout << "inp.failed.fc_copyfile" << endl;

 }


 if(outp.fail()) {

	cout << "outp.failed.fc_copyfile" << endl;

 }


 // Datei kopieren

 outp << inp.rdbuf();


}



void fc_append (string p, string& pad, string dn) { // String aneinander hängen


	pad = p;

	pad += dn;


}




void fc_com (void) { // Text Kommandobox


	cout << "Kopieren & Loeschen" << endl;


}


Bearbeitet von RoflCopter
Code aktualisiert
Link zu diesem Kommentar
Auf anderen Seiten teilen

Mach deine Variablen so lokal wie möglich. Das ist nicht C, wo man alle Variablen am Anfang deklariert. Dann sollte das Problem verschwinden.

Ich vermute die Ursache nämlich darin, dass du den Stringstream nicht zurücksetzt. Da steht noch der Operator von der vorhergehenden Zeile drin.

Ich hatte dir auch vorher schon den Hinweis gegeben, dass du find und substr nicht brauchst. Deine Token-Suchschleife lässt sich stark vereinfachen:

	string gz;
while (getline(csv, gz)){

string p, dn;
int op = 0;

istringstream line(gz);
getline(line, p, ';');
getline(line, dn, ';');
line >> op;

fc_action (op, dn, p + dn, log); // Löschen oder Kopieren
}
[/code]

Ein paar Anmerkungen noch: Mehrere Flags verkettet man mit |, nicht mit Komma. Und c_str liefert niemals Null, die entsprechenden if-Abfragen sind also sinnlos. Falls der String leer ist, liefert c_str einen Zeiger auf einen leeren String. Wenn du eine rudimentäre Gültigkeitsprüfung machen willst, benutz std::string::length.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke dir Klotzkopp, das war die Lösung. :bimei

Diese gigantische Suchschleife war nicht mein Werk - bzw. diese wurd mir so als "optimal" vorgegeben.

Ich solle lernen wie man "damals" ohne die "Super Funktionen etc. pp" klar kommen musste. Auf mein Argument, dass wir ihm HEUTE angekommen sind ging niemand ein.

Bis ich den alt - eingesessenen Kollegen davon überzeugt habe werde ich wohl einiges an Berufserfahrung haben..

Ebenfalls mit den lokalen Variablen - wird hier als "schlecht" und "unlesbar" etc. betitelt - kann mich da relativ schlecht gegen wehren. Es war schon schwer genug meinen Mitarbeiter ( welcher mir "helfen" soll ) dazu zu bringen, das wir das Copy à la char by char raus nehmen.

Zu deinem Link haben diese mir übrigens nichts gesagt - pure Verblüffung kam ans Tageslicht und alle sind sich einen Kaffee holen gegangen..

Nochmals danke an alle Beteiligten - scheinbar muss ich mehr auf mich hören und auch auf google bzw. diverse Foren :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich solle lernen wie man "damals" ohne die "Super Funktionen etc. pp" klar kommen musste. Auf mein Argument, dass wir ihm HEUTE angekommen sind ging niemand ein.
Manchmal hilft da das Argument, dass man ja auch die alten Lochstreifen wieder rausholen könnte. Aber sei besser behutsam und überzeuge durch Ergebnisse.

Bis ich den alt - eingesessenen Kollegen davon überzeugt habe werde ich wohl einiges an Berufserfahrung haben..
Ja, das kann unter Umständen sehr lange dauern. Manchmal bauen sich über die Jahre sehr große Scheuklappen auf. Gegen "Das haben wir schon immer so gemacht" ist kaum ein Kraut gewachsen.

Ebenfalls mit den lokalen Variablen - wird hier als "schlecht" und "unlesbar" etc. betitelt - kann mich da relativ schlecht gegen wehren. Es war schon schwer genug meinen Mitarbeiter ( welcher mir "helfen" soll ) dazu zu bringen, das wir das Copy à la char by char raus nehmen.
Deine Kollegen kennen das vermutlich nicht anders. Unlesbar ist das nur, wenn man es nicht gewohnt ist.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...