Portál AbcLinuxu, 12. května 2025 08:20

Dotaz: C++ a fstream

lobodpav avatar 16.5.2005 21:01 lobodpav | skóre: 8 | Ostrava
C++ a fstream
Přečteno: 2391×
Odpovědět | Admin
Zdravím. Mám drobný problém, se kterým si nevím rady. Potřebuji otevřít soubor pro čtení i pro zápis a pokud neexistuje, tak jej vytvořit. Kód v příloze by to měl provést, ale soubor pouze vytvoří a nic do něj nezapíše...
#include <iostream>
#include <fstream>

using namespace std;

int main() {
  // otevreni pro cteni i zapis
  fstream *dbFile = new fstream("file.txt", ios::in | ios::out | ios::binary);
  if (!dbFile->is_open()) { // soubor nelze otevrit
    cout << "Creating file" << endl;
    dbFile->open("file.txt", ios::out | ios::binary); // vytvoreni souboru
    if (!dbFile->is_open()) {
      cout << "Cannot create file" << endl;
      return 0;
    }
    dbFile->close();
    // otevreni pro cteni i zapis
    dbFile->open("file.txt", ios::in | ios::out | ios::binary);
    if (!dbFile->is_open()) {
      cout << "Cannot open file after create" << endl;
      return 0;
    }
    if (!dbFile->write("AABB", 4))
      cout << "Cannot write to file" << endl;
    dbFile->close();
  }
  else
    cout << "Opening file" << endl;
  delete dbFile;
  return 0;
}
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

16.5.2005 22:21 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: C++ a fstream
Odpovědět | | Sbalit | Link | Blokovat | Admin
Je potřeba zavolat dbFile->clear(), jinak po chybě odmítá spolupracovat. Taky to jde o něco zjednodušit.
#include <fstream>

using namespace std;

int main()
{
  // jako fopen(..., "r+") => O_RDRW
  fstream *dbFile = new fstream("file.txt", ios::in | ios::out);
  if (!*dbFile) {
    dbFile->clear();
    // jako fopen(..., "w+") => O_RDRW | O_TRUNC | O_CREAT
    dbFile->open("file.txt", ios::in | ios::out | ios::trunc);
  }
  if (!*dbFile) {
    perror("file.txt");
    return 1;
  }
  if (!dbFile->write("AAXB", 4)) {
    perror("writing to file.txt");
    return 1;
  }
  dbFile->close();
  delete dbFile;
  return 0;
}
lobodpav avatar 17.5.2005 06:11 lobodpav | skóre: 8 | Ostrava
Rozbalit Rozbalit vše Re: C++ a fstream
Díky!!! O tom clear jsem se nikde nedočetl. Za ta zjednodušení taky díky.
Když už jsme u C++, nevíte, zda se nedá sehnat nějaká dokumentace, jakou má např. Java API?? Nikde jsem nic podobného nenašel a dokumentace linuxu neobsahuje nic kolem C++ ...
17.5.2005 07:33 rastos | skóre: 63 | blog: rastos
Rozbalit Rozbalit vše Re: C++ a fstream
Hladas nieco taketo, taketo alebo taketo?
lobodpav avatar 17.5.2005 08:06 lobodpav | skóre: 8 | Ostrava
Rozbalit Rozbalit vše Re: C++ a fstream
Ano. To jsou good odkazy :-)
Díky!
17.5.2005 10:59 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: C++ a fstream
No, jak na to teď koukám, tak jsem to zjednodušil až moc, kdyby ten program hned neskončil, tak je samozřejmě potřeba delete dbFile; i při chybě (nebo mít dbFile na zásobníku...). Ale podstatné je to volání dbFile->clear() a to, že dbFile->open() stačí volat dvakrát.
lobodpav avatar 17.5.2005 15:23 lobodpav | skóre: 8 | Ostrava
Rozbalit Rozbalit vše Re: C++ a fstream
Jojo, a odstranil jsi mi flag ios::binary, ale to jsou detaily...
Hlavně, že mi to teď hezky běží :-) Dík.
elviin avatar 17.5.2005 21:58 elviin | skóre: 29 | blog: elviin | Plzeň-Praha
Rozbalit Rozbalit vše Re: C++ a fstream

twofish uz te zrejme uspokojil:). jen bych dodal pro inspiraci jine reseni:

#include <iostream>
#include <fstream>

using namespace std;

namespace {
  const string JMENO = "file.txt";   
}


int main() {
  fstream test;
   
  test.exceptions ( ifstream::eofbit | ifstream::failbit | ifstream::badbit );
  
  try {
    test.open ( JMENO.c_str(), ios::in | ios::out | ios::binary | ios::trunc);
  }
  catch (ifstream::failure &e) {
    cerr << e.what() << ":"<< endl; 
    perror ("Vyjimka otevreni/cteni ze souboru.");
    exit(1);
  }

  return 0;
}

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.