Problem: beim datei lesen, wird ungewolltes zusätzliches char angefügt

int0xicated

Grünschnabel
hallo,

wie oben erwähnt, fügt mir die file.get(c) immer am Ende noch ein doppeltes Anführungszeichen an, aber wieso? die file (txt file), die ich öffne hat am ende kein anführungszeichen. zB steht in der file: "abcd" -> beim ausgeben -> "abcd""
der code hier unten ist einfach irgendeine methode ... egal was für methode, immer wenn ich mit file.get(c) und anschließend cout << c;
die char werte ausgeben will, passiert das.

bin etwas ratlos und hoffe ihr könnt mir helfen.
danke im voraus.


lg

CODE:

Code:
	ifstream file;
	file.open(fname,ios::binary | ios::in);
	
	bool check;
	char c = 0;
	string zeile;
	

	check = checkLogfile(fname);
	//überprüfe, ob die geladene Datei richtig formatiert wurde und richtige Feedback werte besitzt.
	if(check == true){
		while(c != '\n' && !file.eof()){
			file.get(c);
			zeile.operator +=(c);
			cout<<c;
		
		}
		while(file.get(c)){
			cout<<c;
		}
		}else{
			cout<<"Logfile konnte nicht geöffnet werden";
	}

	file.close();
	return zeile;
	delete [] fname;
 
Zuletzt bearbeitet:
Hi.

Wie schon so oft ist das .eof() dein Problem. (Such mal im Forum).

Wenn du alle Zeichen bis zum Ende der Datei oder zum Zeilenende einlesen willst, kannst du ganz einfach die getline Funktion verwenden:
C++:
#include <string>

if (getline(file, zeile.operator)) {
  ...
} else {
  // Fehler beim Einlesen.
}
Ich nehme doch an, das zeile.operator ein std::string ist?

Gruß
 
danke! ... ja ist ein string ...

ich hätte noch folgende frage: ich will eine fehlerbehandlung mit exceptions machen, aber obwohl kein fehler auftritt, bringt er eine exception, oder das hier:

"This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information."

hat das was mit dem zu tun?

EDIT: und wie soll ich jetzt überprüfen, ob alle zeilen eingelesen wurde?
 
danke! ... ja ist ein string ...

ich hätte noch folgende frage: ich will eine fehlerbehandlung mit exceptions machen, aber obwohl kein fehler auftritt, bringt er eine exception, oder das hier:

"This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information."

hat das was mit dem zu tun?
Nein, eigentlich nicht. Da wirst du vermutlich einen Fehler gemacht haben. Wie lautet die Exception und wo tritt sie auf?
EDIT: und wie soll ich jetzt überprüfen, ob alle zeilen eingelesen wurde?
Wenn alles ordnungsgemäß eingelesen wurde, dann ist das eof Bit im Streamzustand gesetzt, und das bad Bit ist nicht gesetzt!
C++:
if (!file.bad() && file.eof()) {
  // Einlesen: OK
} else if (!file.bad()) {
  // ein (geringer) Fehler beim Einlesen
  // Rücksetzen mit .clear() möglich
} else {
  // Stream ist im Zustand "bad" (nicht mehr zu verwenden)
}
Gruß
 
danke für die kompetente hilfe :)! diese frage passt jetzt nicht ganz zu diesem thema, aber ich sollte mein programm so speicher unaufwendig wie möglich machen ... wie könnte ich zB diese methode speicherunaufwendiger machen (stichwort dynamische speicherverwaltung), oder hab ich hier schon das maximum herausgeholt? ... wie zB gebe ich ganz normale Strings wieder im speicher frei?

diese methode hier unten öffnet zB eine datei und liest die erste zeile und speicher sie in einen string und returned diesen dann auch ... der rest der file wird über cout ausgegeben.

(zusätzlich noch die frage: diese exception findet wird immer geworfen, egal welche file ich öffne - wieso das?)



danke für jede antwort!

mfg
 
Zuletzt bearbeitet:
C++:
std::string logfile::load_file(const char* file_name) 
{
    if (check_file(file_name) == false) throw std::invalid_argument("invalid file");
	
    std::ifstream file_stream(file_name);
    if (!file_stream) throw std::invalid_argument("invalid filename");

    std::string result;
    std::getline(file_stream, result);
    std::cout << result << "\n";

    std::copy(std::istream_iterator<char>(file_stream), std::istream_iterator<char>(), std::ostream_iterator<char>(std::cout, "\n"));
    
    return result;
}

C++:
return zeile;
	rest.clear();
	delete [] fname;
... nach return wird die Funktion verlassen. Das Löschen von fname wäre auch fatal!
 
danke :)

hätte noch folgende frage: wie kann ich die 2 exceptions untereinander jetzt vergleichen, denn beides ist ja eine invalid_argument exception, aber mit anderem grund (die eine wird geworfen bei ungültigem filename und die zweite bei check = false
 
Zuletzt bearbeitet:
kannst z.b. eine exception-klasse von invalid_argument erben lassen die mit ids arbeitet.
du kannst std::exception::what aufrufen und string der rauskommt vergleichen.
 
Zurück