Programm stürzt bei leerer datei bzw leerer Zeile ab
-
habe ein kleines problem mein programm soll eine textdatei verarbeiten in datensätze mit strtok getrennt werden und verarbeitet werden sollen
mein problem leere dateien oder leere zeilen bringen das programm zum absturz
glaube das der fehler in folgendem code stecktglaube es liegt an Datei.getline(sLine, 256);
if ( !Datei ) { cout << "Kann Datei ( " << dat_ein << " ) nicht öffnen" << endl; } while(!Datei.eof()) { Datei.getline(sLine, 256); // cout << "Zeile :" << sLine << endl; if(sLine == "") continue; if(sLine[0] == '#') continue; // Zeile auseinandernehmen. token = strtok(sLine, Trenner);
-
Beachte, dass eof erst true zurückliefert, wenn EOF bereits gelesen wurde.
-
yep aber dateiende wird ja korrekt erkannt er stürzt ja nur bei leeren zeilen bzw wenn die datei ganz leer ist ab.
-
Hi,
wenn die datei leer ist dann führt vermutlich sline[0] zu problemen.
while(true){ file.getline(sline,255); if(file.eof()) break; if(sline.empty()) continue; //usw } //oder while(std::getline(file,sline)){ //tu was }
-
sLine ist bei mir ein char
ich prufe da so(der code war leider noch von heut vormittag
count tut hier nichts zursache das brauche ich nur um mich in der datei dynamisch zu bewegen da immer nur 10 zeilen auf den bildschirm passenwhile(count-- && !Datei.eof())
{
Datei.getline(sLine, 256);if(!sLine)//funktioniert nicht
{
count++;
continue;
}if(sLine[0] == '#')
{
count++;
continue;
}
-
sLine ist vermutlich ein char[256].
Dann ist sLine niemals NULL, d.h. die Prüfung
if( !sLine)macht keinen Sinn.
Du willst wissen, ob sLine leer ist.
Ein C-String ist leer, wenn kein Zeichen enthalten ist, d.h. er nur einen \0 enthält.
Prüfen kannst Du das mit,if( sLine[0] == '\0')oder mit
if( strlen( sLine) == 0)Mir std::string ist das alles etwas einfacher...
-
Ein C-String ist leer, wenn kein Zeichen enthalten ist, d.h. er nur einen \0 enthält.
Prüfen kannst Du das mit,
C/C++ Code:
if( sLine[0] == '\0')
C/C++ Code:
if( sLine[0] == '\0')
C/C++ Code:
if( sLine[0] == '\0')oder mit
C/C++ Code:
if( strlen( sLine) == 0)
C/C++ Code:
if( strlen( sLine) == 0)
C/C++ Code:
if( strlen( sLine) == 0)Ich bin mir nicht 100% sicher aber ich denke, dass funktioniert nicht.
Wenn du sLine nicht initialisierst und dein File leer ist kann in deiner Variablen irgendwas stehen. getline schreibt in dem Fall einfach nichts in das Array auch nicht \0.
In einer Leerzeile sollte irgenetwas wie \10 \13 (oder umgekehrt ich kann mir das nie merken) drinne stehen.Du solltest auch ein merkwürdiges verhalten haben, wenn du mitten im File eine leere Zeile hast.
schöne grüsse
Tobi
-
@tobi_kn
schau dir doch mal den titel des threats bitte nochmal an, dort steht nämlich das mein programm das von dir beschriebene verhalten hatte nämlich das bei einer leeren zeile das programm abstürtzte.

EDIT: übrigens sLine wird zu beginn der ganzen funktion initialisiert
hatte das hier nicht mitgepostet da danach noch ein block kommt in dem ich pfad und dateiname zusammensetzen muss.
und erst danach kommt dann die while schleifejedenfalls funktioniert das jetzt
das spielchen mit dem count nicht berücksichtigen das dient nur dazu damit ich immer eine bestimmte anzahl an zeilen bekomme und die zeilen die ignoriert werden sollen werden dann ausgeklammert
. . . while(count-- && !Datei.eof()) { Datei.getline(sLine, 256); //cout << "Zeile :" << sLine << endl;//für debugzwecke if( strlen( sLine) == 0 || sLine[0] == '#') { count++; continue; } // Zeile auseinandernehmen. token = strtok(sLine, Trenner); body +="<a name='reply_2256'></a>"; body +="<table class='PhorumListTable' width='100%' cellspacing='0' cellpadding='2' border='0'>"; body +="<tr>"; body +=" <td bgcolor='#31a2c6'><FONT class='PhorumTableHeader' color='#FFFFFF'> "; body += token;//Titel des Posts . . .