Avatar billede emmek Nybegynder
29. januar 2004 - 09:31 Der er 8 kommentarer og
1 løsning

ios::nocreate i filbehandling på C++

Jeg kører et måleprogram på nogle FreeBSD maskiner, og har netop installeret 5.2 på en ny pc som også skal køre programmet, hvor der er en ny compiler GCC 3.3.3 (den jeg før brugte var GCC 2.95.(4/5).

på den gamle GCC giver det ikke nogen compiler fejl, og programmet kører fint.

I mellemtiden er GCC 3.3.3 gået over til at give advarsler hvis man bruger de gamle headere:
#include <iostream.h>
#include <fstream.h>
og ellers anbefale at man brguer de nye headere:
#include <iostream>
#include <fstream>
using namespace std;

med namespace tingeltangel..

Det har jeg så gjort i alt min kode og den brokker sig ikke længere over forældede headere, men derimod dette:
g++ -I/usr/local/include/mysql/ -pthread *.cc -o rawMeasuring.out -L/usr/local/lib/mysql/ -lmysqlclient
ScanList.cc: In member function `void ScanList::generateCSVFile(int&, int&)':
ScanList.cc:189: error: `noreplace' is not a member of type `
  std::basic_ios<char, std::char_traits<char> >'
ScanList.cc:193: error: `nocreate' is not a member of type `
  std::basic_ios<char, std::char_traits<char> >'
ScanList.cc:200: error: `noreplace' is not a member of type `
  std::basic_ios<char, std::char_traits<char> >'
ScanList.cc:204: error: `nocreate' is not a member of type `
  std::basic_ios<char, std::char_traits<char> >'
ScanList.cc:213: error: `noreplace' is not a member of type `
  std::basic_ios<char, std::char_traits<char> >'
TimeClient.cc: In member function `void TCPacketReciever::execute()':
TimeClient.cc:613: error: `noreplace' is not a member of type `
  std::basic_ios<char, std::char_traits<char> >'
TimeClient.cc:617: error: `nocreate' is not a member of type `
  std::basic_ios<char, std::char_traits<char> >'

Et eksempel på en linje der fejler er:
ofstream outfile(filename, ios::out | ios::noreplace);

Gør jeg noget forkert?
Er der lavet om på hvordan fstream virker, eller er GCC stadig ikke forbi alle børnesygdomme i denne version?

PS. GCC 3.3.3 anvendes også på linuxplatforme, så hvis du bruger den der, er dine erfaringer også meget velkomne..
Avatar billede segmose Nybegynder
29. januar 2004 - 09:49 #1
Prøv at checke din ofstream om den stadig har noreplace eller den hedder noget andet.
Avatar billede emmek Nybegynder
29. januar 2004 - 10:17 #2
i /usr/include/c++/3.3 har jeg prøvet og søge (grep) efter nocreate og noreplace..
og ingen af dem findes.. Disse er altså blevet fjernet/omdøbt til andet i denne version... Men hvad skal man så bruge i stedet for???
Avatar billede emmek Nybegynder
29. januar 2004 - 10:23 #3
På de ældre freeBSD maskiner med den gamle compiler i /usr/include/g++/streambuf.h er der følgende:
    enum open_mode {
        in = _IO_INPUT,
        out = _IO_OUTPUT,
        ate = _IO_ATEND,
        app = _IO_APPEND,
        trunc = _IO_TRUNC,
        nocreate = _IO_NOCREATE,
        noreplace = _IO_NOREPLACE,
        bin = _IOS_BIN, // Deprecated - ANSI uses ios::binary.
        binary = _IOS_BIN };
og
#define _IO_NOCREATE        32
men hvad chance er der for at de nye ting kan 'æde' en binær værdi hvis jeg bare skriver den ind som ofstream outfile(filename, ios::out | 32);
og hvor læsbart er det egentlig lige?

Der må sq da være en pænere + nemmere måde..
Avatar billede emmek Nybegynder
29. januar 2004 - 11:02 #4
Så tror jeg sq jeg har fundet noget..
den gamle open_mode hedder nu openmode, med lidt flere modifikationer..
i /usr/include/c++/3.3/bits/ios_base.h:

    typedef _Ios_Openmode openmode;
    /// Seek to end before each write.
    static const openmode app =        openmode(__ios_flags::_S_app);
    /// Open and seek to end immediately after opening.
    static const openmode ate =        openmode(__ios_flags::_S_ate);
    /// Perform input and output in binary mode (as opposed to text mode).
    /// This is probably not what you think it is; see
    /// http://gcc.gnu.org/onlinedocs/libstdc++/27_io/howto.html#3 and
    /// http://gcc.gnu.org/onlinedocs/libstdc++/27_io/howto.html#7 for more.
    static const openmode binary =      openmode(__ios_flags::_S_bin);
    /// Open for input.  Default for @c ifstream and fstream.
    static const openmode in =          openmode(__ios_flags::_S_in);
    /// Open for output.  Default for @c ofstream and fstream.
    static const openmode out =        openmode(__ios_flags::_S_out);
    /// Open for input.  Default for @c ofstream.
    static const openmode trunc =      openmode(__ios_flags::_S_trunc);

men jeg mangler stadig de gamle nocreate og noreplace.. Det er måske meningen at jeg selv skal programmere mig ud af det, med de nye headere?? Hvorfor mon det?
Avatar billede emmek Nybegynder
29. januar 2004 - 11:08 #5
Gider ikke kode mig ud af det.. det kan sq da ikke passe!!
Avatar billede segmose Nybegynder
30. januar 2004 - 09:37 #6
Hvad gør den der noreplace?
Avatar billede emmek Nybegynder
30. januar 2004 - 10:10 #7
den dikterer at når en fil åbnes til skrivning, så må filen IKKE eksistere inden. Hvis man åbner med ios::out, vil en ny fil blive kreeret, hvis den ikke findes i forvejen, men hvis den findes i forvejen, så har man skrive-adgang til denne.

Man kan selvfølgelig teste om en fil findes i forvejen, ved at prøve og åbne den, og se om dette lykkedes, men det er lidt (læs: meget) bøvlet i forhold til blot at give denne parameter med.

nocreate er det inverse af noreplace, hvor filen SKAL eksistere i forvejen, for at man kan åbne den til skrivning.
Avatar billede emmek Nybegynder
30. januar 2004 - 10:14 #8
hovsa.. noget mundlort jeg fik skrevet der.. Prøv det her i stedet..
"..kreeret, hvis den ikke findes i forvejen, men hvis den findes i forvejen ÅBNES DEN IKKE.

Man kan self..."
Avatar billede emmek Nybegynder
07. februar 2004 - 14:34 #9
Nå, de to options er åbenbart fjernet.. lukker..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester