fehler beim öffnen von datei



  • Ich will daten in eine datei schreiben. diese existiert noch nicht, aber laut reference wird diese erstellt, bekommen jedoch immer fehler bei good(),bad() ect. er erstellt sie zwar schreibt dann aber nichts rein. Beim zweiten durchlauf gehts dann immer wenn die datei da ist. Kann es sein das die datei einfach noch nicht geöffnet ist? trotz des .open(...)
    Habe folgenden code:

    fstream filestr;
    fstream filestr_result;
    
    filestr_result.open ("result.txt", fstream::in | fstream::out);
    if (filestr_result.good())
    {
    cout << "DATEI OK"<<endl;
    }
    
    filestr_result.open ("result.txt", fstream::in | fstream::out);
    for (int i=0;i<100;i++){
    filestr_result << i << endl;
    }
    

    danke ich vorraus



  • filestr_result ("result.txt", fstream::in | fstream::out);
    

    Diese Zeile ist unnoetig.

    Wenn deine Datei zum Schreiben geöffnet wird, wird das good-Flag gesetzt bei erfolgreichem Öffnen. Drum ist good kein Fehler. Die Meldung von dir ist also Irreführend und macht Sinn bei Prüfung auf bad() oder fail().

    if (filestr_result.fail())
    {
        cout << "fehler bei datei"<<endl;
    }
    

    Oder gleich ganz anders, wenn Datei erfolgreich geöffnet wurde, reinschreiben:

    if (filestr_result.good())
    {
        for (int i=0;i<100;i++){
            filestr_result << i << endl;
    }
    

    Und am Ende Datei natürlich noch schließen 👍



  • if (filestr_result.fail())
    

    hab das das .open vergessen zu schreiben.

    Ja es geht um die datei result.txt und den fstream filestr_result. und das spuckt bad() auch ein fehler. und good() sagt auch 0.



  • Also das Problem hat sich immer noch nicht gelöst.:

    ICh will eine Datei erstellen und öfffnen. Diese Datei existiert nicht voher, später ja.

    der Code ist folgender.

    //das ist abstrahiert, muss aber im code bleiben
    stringstream udo;
    string hans;
    
    udo << "karl.txt";
    hans = udo.str();
    
    fstream file;
    
    file.open (hans.c_str(), ios::in);
    
    if (file.good () == false){
       cout << "konnte datei nicht öffnen // erstellen" << endl;
    }else {
       cout << "alles gut"<<endl;
    }
    

    Das Problem ist eigentlich müsste good true ja liefern wenn alles gut ist, aber es wird immer false angezeigt. Wie kann das sein?

    ruß und danke für hilfe



  • Kann man eine Datei mit ios::in öffnen, die nicht existiert?



  • betrifft ja den stream selbst, denke schon oder?



  • Heimelchen schrieb:

    Kann man eine Datei mit ios::in öffnen, die nicht existiert?

    Hallo,

    ein Stream kann nicht zum Lesen geöffnet werden, wenn die Datei nicht existiert. Welchen Sinn soll das auch haben?

    mfg Martin



  • ja ist ja richtig, ich will ja nur das die datei erstellt wird. Mir ist klar geworden das good() auch immer fehlschalgen wird, da wenn eine neue datei erstellt wurde ja das eof() bit eh gesetzt ist.

    das problem ist, das ich die Datei vom namen nicht einmal selbst erstellen kann, weil die hashverschlüsselt vorliegt. Und der Hash wird im vorfeld direkt erstellt.
    Ein umweg wäre es direkt die datei somit in c++ zu erzeugen.

    Also geht open nur mit ner vorhandenen datei? Aber laut c++ ref erstellt er doch sonst eine, aber es wird keine im verzeinis angezeigt.



  • greenghecco schrieb:

    das problem ist, das ich die Datei vom namen nicht einmal selbst erstellen kann, weil die hashverschlüsselt vorliegt. Und der Hash wird im vorfeld direkt erstellt.
    Ein umweg wäre es direkt die datei somit in c++ zu erzeugen.

    Muß ich das verstehen? 😕 Wenn Du die Datei nicht erstellen kannst, weil Du nur den Hashwert des Namens hast, dann kannst Du sie auch nicht zum Lesen öffnen.

    mfg Martin



  • das bezieht sich darauf, wenn ich die Datei manuell zum testen erstellen will ;).

    Wenn ich jetzt aber

    file.open("test.txt", fstream::out);
    

    eingebe funktioniert es. Es scheint also an der c_str()-Funktion zu liegen.

    So fehler gefunden. Im Hash befinden sich auch sonderzeichen, wie zb. dez wert 22 im char. das entspricht einem syn. Das darf wohl nicht im Dateinamen auftauchen. damit wird die erstellung des dateinnamens nicht erlaubt. da bleibt einem nur noch das in eine integer dateinamen umzuwandeln 🙂



  • Nein es liegt am Modus. ios::out erstellt eine Datei, wenn nicht vorhanden, ios:in nicht. Wäre ja auch nicht sinnvoll.


Anmelden zum Antworten