|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- /* Arduino SdFat Library
- * Copyright (C) 2012 by William Greiman
- *
- * This file is part of the Arduino SdFat Library
- *
- * This Library is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This Library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with the Arduino SdFat Library. If not, see
- * <http://www.gnu.org/licenses/>.
- */
- #ifndef SdStream_h
- #define SdStream_h
- /**
- * \file
- * \brief \ref fstream, \ref ifstream, and \ref ofstream classes
- */
- #include <SdBaseFile.h>
- #include <iostream.h>
- //==============================================================================
- /**
- * \class SdStreamBase
- * \brief Base class for SD streams
- */
- class SdStreamBase : protected SdBaseFile, virtual public ios {
- protected:
- /// @cond SHOW_PROTECTED
- int16_t getch();
- void putch(char c);
- void putstr(const char *str);
- void open(const char* path, ios::openmode mode);
- /** Internal do not use
- * \return mode
- */
- ios::openmode getmode() {return m_mode;}
- /** Internal do not use
- * \param[in] mode
- */
- void setmode(ios::openmode mode) {m_mode = mode;}
- bool seekoff(off_type off, seekdir way);
- bool seekpos(pos_type pos);
- int write(const void* buf, size_t n);
- void write(char c);
- /// @endcond
- private:
- ios::openmode m_mode;
- };
- //==============================================================================
- /**
- * \class fstream
- * \brief SD file input/output stream.
- */
- class fstream : public iostream, SdStreamBase {
- public:
- using iostream::peek;
- fstream() {}
- /** Constructor with open
- *
- * \param[in] path path to open
- * \param[in] mode open mode
- */
- explicit fstream(const char* path, openmode mode = in | out) {
- open(path, mode);
- }
- #if DESTRUCTOR_CLOSES_FILE
- ~fstream() {}
- #endif // DESTRUCTOR_CLOSES_FILE
- /** Clear state and writeError
- * \param[in] state new state for stream
- */
- void clear(iostate state = goodbit) {
- ios::clear(state);
- SdBaseFile::writeError = false;
- }
- /** Close a file and force cached data and directory information
- * to be written to the storage device.
- */
- void close() {SdBaseFile::close();}
- /** Open a fstream
- * \param[in] path file to open
- * \param[in] mode open mode
- *
- * Valid open modes are (at end, ios::ate, and/or ios::binary may be added):
- *
- * ios::in - Open file for reading.
- *
- * ios::out or ios::out | ios::trunc - Truncate to 0 length, if existent,
- * or create a file for writing only.
- *
- * ios::app or ios::out | ios::app - Append; open or create file for
- * writing at end-of-file.
- *
- * ios::in | ios::out - Open file for update (reading and writing).
- *
- * ios::in | ios::out | ios::trunc - Truncate to zero length, if existent,
- * or create file for update.
- *
- * ios::in | ios::app or ios::in | ios::out | ios::app - Append; open or
- * create text file for update, writing at end of file.
- */
- void open(const char* path, openmode mode = in | out) {
- SdStreamBase::open(path, mode);
- }
- /** \return True if stream is open else false. */
- bool is_open () {return SdBaseFile::isOpen();}
-
- protected:
- /// @cond SHOW_PROTECTED
- /** Internal - do not use
- * \return
- */
- int16_t getch() {return SdStreamBase::getch();}
- /** Internal - do not use
- * \param[out] pos
- */
- void getpos(FatPos_t* pos) {SdBaseFile::getpos(pos);}
- /** Internal - do not use
- * \param[in] c
- */
- void putch(char c) {SdStreamBase::putch(c);}
- /** Internal - do not use
- * \param[in] str
- */
- void putstr(const char *str) {SdStreamBase::putstr(str);}
- /** Internal - do not use
- * \param[in] pos
- */
- bool seekoff(off_type off, seekdir way) {
- return SdStreamBase::seekoff(off, way);
- }
- bool seekpos(pos_type pos) {return SdStreamBase::seekpos(pos);}
- void setpos(FatPos_t* pos) {SdBaseFile::setpos(pos);}
- bool sync() {return SdStreamBase::sync();}
- pos_type tellpos() {return SdStreamBase::curPosition();}
- /// @endcond
- };
- //==============================================================================
- /**
- * \class ifstream
- * \brief SD file input stream.
- */
- class ifstream : public istream, SdStreamBase {
- public:
- using istream::peek;
- ifstream() {}
- /** Constructor with open
- * \param[in] path file to open
- * \param[in] mode open mode
- */
- explicit ifstream(const char* path, openmode mode = in) {
- open(path, mode);
- }
- #if DESTRUCTOR_CLOSES_FILE
- ~ifstream() {}
- #endif // DESTRUCTOR_CLOSES_FILE
- /** Close a file and force cached data and directory information
- * to be written to the storage device.
- */
- void close() {SdBaseFile::close();}
- /** \return True if stream is open else false. */
- bool is_open() {return SdBaseFile::isOpen();}
- /** Open an ifstream
- * \param[in] path file to open
- * \param[in] mode open mode
- *
- * \a mode See fstream::open() for valid modes.
- */
- void open(const char* path, openmode mode = in) {
- SdStreamBase::open(path, mode | in);
- }
-
- protected:
- /// @cond SHOW_PROTECTED
- /** Internal - do not use
- * \return
- */
- int16_t getch() {return SdStreamBase::getch();}
- /** Internal - do not use
- * \param[out] pos
- */
- void getpos(FatPos_t* pos) {SdBaseFile::getpos(pos);}
- /** Internal - do not use
- * \param[in] pos
- */
- bool seekoff(off_type off, seekdir way) {
- return SdStreamBase::seekoff(off, way);
- }
- bool seekpos(pos_type pos) {return SdStreamBase::seekpos(pos);}
- void setpos(FatPos_t* pos) {SdBaseFile::setpos(pos);}
- pos_type tellpos() {return SdStreamBase::curPosition();}
- /// @endcond
- };
- //==============================================================================
- /**
- * \class ofstream
- * \brief SD card output stream.
- */
- class ofstream : public ostream, SdStreamBase {
- public:
- ofstream() {}
- /** Constructor with open
- * \param[in] path file to open
- * \param[in] mode open mode
- */
- explicit ofstream(const char* path, ios::openmode mode = out) {
- open(path, mode);
- }
- #if DESTRUCTOR_CLOSES_FILE
- ~ofstream() {}
- #endif // DESTRUCTOR_CLOSES_FILE
- /** Clear state and writeError
- * \param[in] state new state for stream
- */
- void clear(iostate state = goodbit) {
- ios::clear(state);
- SdBaseFile::writeError = false;
- }
- /** Close a file and force cached data and directory information
- * to be written to the storage device.
- */
- void close() {SdBaseFile::close();}
- /** Open an ofstream
- * \param[in] path file to open
- * \param[in] mode open mode
- *
- * \a mode See fstream::open() for valid modes.
- */
- void open(const char* path, openmode mode = out) {
- SdStreamBase::open(path, mode | out);
- }
- /** \return True if stream is open else false. */
- bool is_open() {return SdBaseFile::isOpen();}
-
- protected:
- /// @cond SHOW_PROTECTED
- /**
- * Internal do not use
- * \param[in] c
- */
- void putch(char c) {SdStreamBase::putch(c);}
- void putstr(const char* str) {SdStreamBase::putstr(str);}
- bool seekoff(off_type off, seekdir way) {
- return SdStreamBase::seekoff(off, way);
- }
- bool seekpos(pos_type pos) {return SdStreamBase::seekpos(pos);}
- /**
- * Internal do not use
- * \param[in] b
- */
- bool sync() {return SdStreamBase::sync();}
- pos_type tellpos() {return SdStreamBase::curPosition();}
- /// @endcond
- };
- //------------------------------------------------------------------------------
- #endif // SdStream_h
|