fgets problem...



  • Hallo zusammen,

    ich hab ein kleines Problem. Ich versuche eine txt Datei einzulesen und sie erstmal genauso zeilen weise auszugeben. (ich muss son minigreptool) schreiben.

    so aber folgendes funktioniert absolut nicht.

    FILE* dataFile = fopen(path,"r");
    
    while (!feof(dataFile))
    {
           fgets(content,mll,dataFile);
           cout << content; 
    }
    

    Problem an der ganzen Sache ist dass mir die letzte Zeile der Datei die ich einlesen will immer doppelt ausgegeben wird. und ich versteh beim besten willen nicht warum. Was mach ich hier falsch?

    Gruss Jens

    Und noch ein frohes Fest *G*



  • Noch nie was von streams gehört? Guck mal ins faq. Kurzbeispiel ohne Erklärung:

    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
    
    int main()
    {
        cout<<"Dateiname eingeben (ohne Leerzeichen):";
        string str;
        cin>>str;
        ifstream file(str.c_str(),ios::in|ios::binary);
        if(!file)
        {
            cerr<<"ERROR";
            return -1;
        };
        char c;
        while(file.get(c))
            cout<<c;
        cin.get();
        return 0;
    };
    

    Nicht getestet, sollte aber richtig sein...
    /edit: Jaja, Caipi hat recht...



  • ness schrieb:

    Noch nie was von streams gehört? Guck mal ins faq. Kurzbeispiel ohne Erklärung:

    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
    
    int main()
    {
        cout<<"Dateiname eingeben (ohne Leerzeichen):"; // ;
        string str;
        cin>>str;
         // hier muss doch kein ios::in stehen, oder?  Wenn man eine Datei per ifstream oeffnet, ist das ios::in Flag doch schon per Default gesetzt?
        ifstream file(str.c_str(),ios::binary); 
        if(!file)
        {
            cerr<<"ERROR";
            return -1;
        };
        char c;
        while(file.get(c)) // file
            cout<<c;
        cin.get();
        return 0;
    };
    

    Nicht getestet, sollte aber richtig sein...

    Habs mal korrigiert, so sollte es funktionieren 😉 *KorintenKack*

    Caipi



  • Die würde ich ja auch gerne benutzen wenn ich es dürfte.
    Uns wurde allerdings vorgeschrieben wir sollen uns auf fopen,fgets,fclose reduzieren. uni suckt 🙂



  • Sengi schrieb:

    uni suckt

    Ansichtssache 😉

    nutze die anweisung 'break' VOR der cout-ausgabe, dann wird die schleife VOR dem letzten mal (in deinem falle die doppelte ausgabe) abgebrochen

    :xmas1: merry christmas :xmas2:



  • also in deinem falle:

    while (!feof(dataFile)) 
    { 
           fgets(content,mll,dataFile); 
           if (feof(dataFile)){break;};
           cout << content; 
    }
    


  • *Kopf gegen die Wand donner*
    Ich danke dir und frohes Fest 🙂

    gruss
    Jens :xmas2:



  • hm hätte da direkt noch eine frage.

    und zwar hab ich einen string content und einen string test

    dann liefert mir strstr(content,test) einen pointer auf den anfang des suchstrings in dem hauptstring zurück oder?

    wie kann ich wenn ich den kompletten string ausgebe direkt auf die stelle zeigen wo der suchstring beginnt.

    Hauptstring = Hallo Du Wie gehts
    suchstring= Du

    So dass ich mit content [stelle] da drunter den kennzeichnen kann.

    uff das war unverständlich *grübel* hoffe mich versteht jemand.



  • also hiermit kannst du einzelne zeichen suchen:

    #include <iostream>
    #include <string>
    using namespace std;
    
    string dateiname=("Hallo Du Wie gehts");
    
    int main(){
        dateiname[dateiname.find(' ')]; // versuche mal '.find("DA")'
    }
    


  • hm ich mein das ein wenig anders:

    ich hab folgendes

    if (strstr(content,suchstring))
    {
       cout << content;
       cout << "^";
    }
    

    Das ^ soll genau unter der Stelle stehen wo der Suchstring in content beginnt.

    Sorry wenn ich mich ein wenig unverständlich ausgedrückt hab.



  • Probiers mal hiermit:

    #include <iostream>
    #include <cstring>
    using namespace std;
    
    int main()
    {
            char* str1 = "Das ist ein Test";
            char* str2 = "Test";
            unsigned char* pos = strstr(str1, str2);
    
            cout << "\n\n Der Teilstring \'" << str2 << "\' kommt im Hauptstring \'" << str1 << "\' ";
            if(pos != NULL)
            {
    
                    cout << "vor" << endl << endl;
                    cout << "\t" << str1 << endl << "\t";
                    for(unsigned char i = 0; str1[i] != *pos; ++i)
                            cout << " ";
    
                    cout << "^" << endl;
            }                                        
            else
                    cout << "nicht vor" << endl;                
    
            return 0;
    }
    

    Hoffe ich konnte helfen.
    Caipi

    Frohe Weihnachten! :xmas1: :xmas2:



  • gut, aber wenn du bei:

    unsigned char* pos = strstr(str1, str2);
    

    das 'unsigned' entfernst klapps auch 😉


Anmelden zum Antworten