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 steckt

    glaube 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 passen

    while(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 schleife

    jedenfalls 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'>&nbsp;";
    
    body += token;//Titel des Posts
    
    .
    .
    .
    

Anmelden zum Antworten