Merge commit '48410b113dd2036e69dbf723a39ec9af02fc9b12'
[xonotic/netradiant.git] / libs / stream / textfilestream.h
1 /*
2 Copyright (C) 2001-2006, William Joseph.
3 All Rights Reserved.
4
5 This file is part of GtkRadiant.
6
7 GtkRadiant is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 GtkRadiant is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GtkRadiant; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20 */
21
22 #if !defined(INCLUDED_STREAM_TEXTFILESTREAM_H)
23 #define INCLUDED_STREAM_TEXTFILESTREAM_H
24
25 #include "itextstream.h"
26 #include <stdio.h>
27
28 /// \brief A wrapper around a file input stream opened for reading in text mode. Similar to std::ifstream.
29 class TextFileInputStream : public TextInputStream
30 {
31   FILE* m_file;
32 public:
33   TextFileInputStream(const char* name)
34   {
35     m_file = name[0] == '\0' ? 0 : fopen(name, "rt");
36   }
37   ~TextFileInputStream()
38   {
39     if(!failed())
40       fclose(m_file);
41   }
42
43   bool failed() const
44   {
45     return m_file == 0;
46   }
47
48   std::size_t read(char* buffer, std::size_t length)
49   {
50     return fread(buffer, 1, length, m_file);
51   }
52 };
53
54 /// \brief A wrapper around a file input stream opened for writing in text mode. Similar to std::ofstream.
55 class TextFileOutputStream : public TextOutputStream
56 {
57   FILE* m_file;
58 public:
59   TextFileOutputStream(const char* name)
60   {
61     m_file = name[0] == '\0' ? 0 : fopen(name, "wt");
62   }
63   ~TextFileOutputStream()
64   {
65     if(!failed())
66       fclose(m_file);
67   }
68
69   bool failed() const
70   {
71     return m_file == 0;
72   }
73
74   std::size_t write(const char* buffer, std::size_t length)
75   {
76     return fwrite(buffer, 1, length, m_file);
77   }
78 };
79
80 template<typename T>
81 inline TextFileOutputStream& operator<<(TextFileOutputStream& ostream, const T& t)
82 {
83   return ostream_write(ostream, t);
84 }
85
86
87 #endif