datei öffnen?



  • hallo, ich möchte eine datei mit c++ öffnen. ich möchte in diese datei sowohl schreiben als auch aus ihr lesen. wenn die datei vorhanden ist, soll diese geöffnet werden, ansonsten soll sie erstellt werden. sie soll im binärmodus geöffnet werden.

    ich probiere das zZ so:

    fstream m_file;
    m_file.open(m_filename, ios_base::in | ios_base::out | ios_base::binary);
    

    leider schlägt die funktion fehl, wenn die datei nicht existiert. ich habe auch noch probiert, zusätzlich ios_base::trunc anzugeben, dann wird die datei zwar erstellt, wenn sie noch nicht existierte, aber ich kann nicht in sie reinschreiben.

    ich benutze winxpsp2 und msvc6.0.

    vielen dank für eure hilfe.



  • Hallo

    Probier es mal so:

    fstream m_file(m_filename, ios_base::in | ios_base::out | ios_base::binary);
    

    chrische



  • geht leider auch nicht.



  • xFILEx schrieb:

    geht leider auch nicht.

    msvc6.0 ??? Irr ich mich, oder war das nicht dieser Compiler der sein eigenes C++ hat?

    Wenn Mircosoft, dann besorg den den neuen VC2005 Express oder wie der heißt, den gibt's kostenlos zum downloaden.

    mfg.



  • ja ich weiß das die runtime nicht sehr gut programmiert ist von dem alten compiler, aber notfalls greif ich auf FILE* zurück (fstream ist imo auch nur ein wrapper davon), denn ich will gewähren, dass mein programm auch auf 9x läuft.



  • xFILEx schrieb:

    denn ich will gewähren, dass mein programm auch auf 9x läuft.

    Das kriegste aber auch mit mingw hin, glaub ich.

    mfg.



  • Hallo,
    die Kombination von out und in bedeutet "r+", also Lesen und Schreiben aber nur, falls die Datei existiert. Damit die Datei bei Nichtexistenz erzeugt wird, musst du noch trunc oder app ergänzen. trunc, falls eine vorhandene Datei vor dem Öffnen erst geleert werden soll. app, falls nicht. app setzt den Write-Pointer nach dem Öffnen ans Ende der Datei. Falls das nicht gewünscht ist, musst du nach dem Öffnen noch mit seekp die richtige Write-Position suchen.

    Also z.B.

    m_file.open(m_filename, ios_base::in | ios_base::out | ios_base::app | ios_base::binary);
    


  • hallo, vielen dank für deine antwort.
    leider gibt es ein problem bei ::app

    When new bytes are written to the file, they are always appended to the end, even if the position is moved with the ostream::seekp function.

    also ich hatte bisher in meinem code:

    m_file.open(m_filename, ios_base::in | ios_base::out | ios_base::binary);
    
    if (!m_file.is_open || !m_file.good())
    {
      m_file.open(m_filename, ios_base::in | ios_base::out | ios_base::binary | ios_base::trunc);
    
      if (!m_file.is_open || !m_file.good())
      {
        ERROR_MSG;
      }
    }
    

    naja, und es wurde jedesmal die error message ausgegeben, weil .good() fehlschlägt.



  • achso wegen mingw: vllt werde ich es tatsächlich für den final build verwenden, aber zur zeit möchte ich noch mit der ide von msvc6 arbeiten.



  • xFILEx schrieb:

    hallo, vielen dank für deine antwort.
    leider gibt es ein problem bei ::app

    When new bytes are written to the file, they are always appended to the end, even if the position is moved with the ostream::seekp function.

    also ich hatte bisher in meinem code:

    m_file.open(m_filename, ios_base::in | ios_base::out | ios_base::binary);
    
    if (!m_file.is_open || !m_file.good())
    {
      m_file.open(m_filename, ios_base::in | ios_base::out | ios_base::binary | ios_base::trunc);
    
      if (!m_file.is_open || !m_file.good())
      {
        ERROR_MSG;
      }
    }
    

    naja, und es wurde jedesmal die error message ausgegeben, weil .good() fehlschlägt.

    hinter is_open muss noch ein ().

    Bei mir klappt der Code mit MinGW und wenn du an MS gewöhnt bist teste doch mal das VC2005 Express das bekommst du hier: http://msdn.microsoft.com/vstudio/express/visualc/download/

    mfg.



  • hi,

    klar im original sind klammer drum rum 🙂 danke.

    und ich habe vc .net 2005 schon probiert und auch installiert, aber das erforderliche .net framework und die aufgeblähten exen stören mich halt noch..aber früher oder später wird man wohl umsteigen müssen 😞

    das komische ist auch, dass der aufruf einmal gelingt bei einer datei, in die kann ich dann problemlos schreiben, auch wenn sie noch nicht erstellt war.
    aber bei einer anderen, die ich mit relativen pfadangaben erstellen möchte (liegt es vllt daran?), schlägt good() halt wie gesagt fehl.



  • xFILEx schrieb:

    hi,

    klar im original sind klammer drum rum 🙂 danke.

    und ich habe vc .net 2005 schon probiert und auch installiert, aber das erforderliche .net framework und die aufgeblähten exen stören mich halt noch..aber früher oder später wird man wohl umsteigen müssen 😞

    das komische ist auch, dass der aufruf einmal gelingt bei einer datei, in die kann ich dann problemlos schreiben, auch wenn sie noch nicht erstellt war.
    aber bei einer anderen, die ich mit relativen pfadangaben erstellen möchte (liegt es vllt daran?), schlägt good() halt wie gesagt fehl.

    Also bei mir geht's mit relativen und absoluten pfaden. Ich glaube jetzt wird's schwer dir zu helfen, denn der Code ist so eigentlich richtig.

    Sonst kannst du ja auch noch andere IDEs wie Dev-C++ oder Code::Blocks ausprobieren, auf jeden fall würde ich dir von VC 6 abraten.

    mfg.


Log in to reply