Problem mit fopen()



  • Hi,

    zuerst: Ja, ich verwende kein ofstream und das hat auch gute Gründe (wenn ich die jetzt aber hier nenn, versucht ihr wieder, mich zu "bekehren" 😃 ).

    Auf jeden Fall geht sowas net: (fopen() liefert 0 zurück)

    m_pFile = fopen("test.txt", "tw");
    

    Das aber schon:

    m_pFile = fopen("test.txt", "w");
    

    Obwohl t laut MSDN ein gültiger Bezeichner im Formatstring ist. 😞

    ChrisM



  • Wenn Du keinen ofstream verwendest was machst Du dann hier im C++-Forum? Ab nach ANSI-C mit Dir! 🙂



  • m_pFile ist ein Member in einer Klasse und in C gibts keine Klassen, aber damit kann ich den Thread wohl nicht mehr retten 😃

    Also, wenn ihr meint, verschiebt ihn einfach 🙂

    ChrisM



  • if t nor b are given, it is used the default method (commonly t). In most compilers this default method is specified by the global variable _fmode defined in stdio.h.

    link: http://www.cplusplus.com/ref/cstdio/fopen.html
    fopen kann man in C++ aber genauso verwenden 😉
    aber die gründe für den einsatz möchte ich jetzt schon noch hören!

    [ Dieser Beitrag wurde am 25.04.2003 um 22:28 Uhr von davie editiert. ]



  • Danke für den Link, aber ich versteh immer noch nicht, warum ich t nicht angeben darf. Nur, weils auf vielen OS die Standardeinstellung ist, darf man es doch wohl trotzdem angeben (zur Sicherheit, falls es mal nicht mehr die Standardeinstellung ist), oder?

    Die Gründe: Ich brauche Lese-/Schreibunterscheidung zur Laufzeit und wusste nicht, ob ofstream und ifstream eine Basisklasse haben, von der man dann einen Pointer halten kann. Außerdem müsste ich dann immer eine RTTI-Prüfung machen, um auch sicherzustellen, dass zum Schreiben wirklich ein ofstream und zum Lesen wirklich ein ifstream initialisiert ist.
    Außerdem denke ich, dass die C-Lösung etwas schneller ist, oder?

    Kann ofstream und ifstream überhaupt richtig mit rohen Binärdaten arbeiten?

    ChrisM



  • Die C-Lösung ist natürlich nicht schneller.

    ofstream ist ein ostream und ifstream ist ein istream, aber warum setzt Du nicht einfach fstream ein?



  • Noch nie gehört, aber die Klasse bzw. das Template gibts ja wirklich 😃

    Andernfalls bringts ja auch kaum Vorteile, wenn ich die C++-Lösung nehme, Unicode und so Zeugs brauch ich eh net.

    Ich will nur, dass mein fopen() mit "t" geht... 🙂

    ChrisM



  • Unicode? Hä? Was hat denn das mit fstreams zu tun?

    Ach ja, ich vergaß, fstreams können natürlich mit "Binärdaten" arbeiten, einfach mit dem std::ios::binary-Flag öffnen.



  • nimm doch einfach fstream:

    fstream x("bla", ios::in);
    x.close();
    x.open ("bla", ios::out);
    x.close();
    x.open ("bla", ios::in|ios::out|ios::binary);
    


  • OK, ok, ich kann ja immer noch später wechseln, aber jetzt soll erstmal das laufen.
    Ich seh in der C++-Lösung für mich halt im Gegensatz zu anderen nützlichen Templates wie die STL-Container keine Vorteile.

    ChrisM



  • Original erstellt von ChrisM:
    **
    Ich will nur, dass mein fopen() mit "t" geht... 🙂
    **

    wenn in der anleitung steht, es geht, ist's vielleicht ein fehler in der lib an sich? update?



  • schon mal von RAII gehört?



  • @davie: Ist VC 6.0 Standard. Kann da echt ein Fehler in der Standardbibliothek drin sein, bei so einer uralten Funktion, die ja schon seit VC 1.0 wahrscheinlich dabei ist?

    ChrisM



  • mal shcnell mit dem gcc getestet:

    //Test 1:
    FILE *bar = fopen("test.txt", "tw");
    bar == 0
    
    //Test 2:
    FILE *bar = fopen("test.txt", "wt");
    bar != 0
    

    😃



  • Jetzt gehts bei mir auch 😃

    Können die sowas net in die Doku schreiben?

    In addition to the above values, the following characters can be included in mode to specify the translation mode for newline characters (MSDN unter fopen())

    "Included" heißt für mich, entweder vorne oder hintendran!

    ChrisM



  • PS: Hab ich vergessen: Danke! 🙂



  • es mag dich überaschen, aber es gibt kein 't'

    t ist immer default mäeßig an - dh wenn du explizit die datei als binary behandeln willst, dann musst du b als 2. oder 3. Zeichen des zweiten parameters angeben. (sollte dieser parameter nur aus 2 zeichen bestehen, dann muss b natürlich das zweite zeichen sein)

    kleiner Tipp an alle:
    Die MSDN ist gut, wenn man etwas über Microsoft Produkte wissen will, aber wenns um C++ geht, dann vertraue ich lieber auf etwas echtes.

    PS:
    sorry, aber warum willst du nicht C++ programmieren?
    fstream ist so mächtig - da würde ich mich nie mit FILE* rumschlagen!!

    kann es sein, dass du lern-faul bist?



  • kann es sein, dass du lern-faul bist?

    Gut möglich. 😃

    Ist bei STLPort auch eine neue Version von fstream dabei?

    ChrisM



  • Original erstellt von ChrisM:
    Ich seh in der C++-Lösung für mich halt im Gegensatz zu anderen nützlichen Templates wie die STL-Container keine Vorteile.

    hast natürlich recht, C Filehandling ist eh viel besser

    hier ein paar Beispiele, die dies schön zeigen

    class foo
    {
      friend std::ostream &operator<<(std::ostream&,const foo&);
    //...
    };
    
    void bar(std::ostream &out) {
      foo baz(/*...*/);
      //...
      out << baz << endl;
      //...
    }
    

    das lässt sich natürlich eben so leicht mit C Filehandling darstellen 😉

    oder ein weiteres schönes Beispiel

    template<class T> void foo(std::ostream &out,const T¶m)
    {
      out << param << endl;
    }
    

    das ist natürlich auch ganz leicht mit C Filehandling 😉



  • Wie einigen bereits bekannt ist, HASSE ich ja I/O. Wie war das noch? Man sollte keine fstreams als Member haben, oder so (hab ich ma gehört, hatte auch Probleme mit irgendsowas). Ich gehöre außerdem zu der Spezies, die möglichst nur bool? getline(istream&,string&) verwenden. Da ist ChrisM's anti-iostream Einstellung doch irgendwo verständlich. Für binäre Dateien is aber eh open(), creat(), close(), read(), write() am coolsten 😉

    EDIT: nein, memory mapping rulet

    [ Dieser Beitrag wurde am 26.04.2003 um 14:41 Uhr von Mr. N editiert. ]


Anmelden zum Antworten