|
|
1.1 root 1: /***
2: *fstream.h - definitions/declarations for filebuf and fstream classes
3: *
4: * Copyright (c) 1991-1992, Microsoft Corporation. All rights reserved.
5: *
6: *Purpose:
7: * This file defines the classes, values, macros, and functions
8: * used by the filebuf and fstream classes.
9: * [AT&T C++]
10: *
11: ****/
12:
13: #ifndef _INC_FSTREAM
14: #define _INC_FSTREAM
15:
16: #include <iostream.h>
17:
18: // Force word packing to avoid possible -Zp override
19: #pragma pack(4)
20:
21: #pragma warning(disable:4505) // disable unwanted /W4 warning
22: // #pragma warning(default:4505) // use this to reenable, if necessary
23:
24: typedef int filedesc;
25:
26: class filebuf : public streambuf {
27: public:
28: static const int openprot; // default share/prot mode for open
29:
30: // optional share values for 3rd argument (prot) of open or constructor
31: static const int sh_none; // exclusive mode no sharing
32: static const int sh_read; // allow read sharing
33: static const int sh_write; // allow write sharing
34: // use (sh_read | sh_write) to allow both read and write sharing
35:
36: // options for setmode member function
37: static const int binary;
38: static const int text;
39:
40: filebuf();
41: filebuf(filedesc);
42: filebuf(filedesc, char *, int);
43: ~filebuf();
44:
45: filebuf* attach(filedesc);
46: filedesc fd() const { return (x_fd==-1) ? EOF : x_fd; }
47: int is_open() const { return (x_fd!=-1); }
48: filebuf* open(const char *, int, int = filebuf::openprot);
49: filebuf* close();
50: int setmode(int = filebuf::text);
51:
52: virtual int overflow(int=EOF);
53: virtual int underflow();
54:
55: virtual streambuf* setbuf(char *, int);
56: virtual streampos seekoff(streamoff, ios::seek_dir, int);
57: // virtual streampos seekpos(streampos, int);
58: virtual int sync();
59:
60: private:
61: filedesc x_fd;
62: int x_fOpened;
63: };
64:
65: class ifstream : public istream {
66: public:
67: ifstream();
68: ifstream(const char *, int =ios::in, int = filebuf::openprot);
69: ifstream(filedesc);
70: ifstream(filedesc, char *, int);
71: ~ifstream();
72:
73: streambuf * setbuf(char *, int);
74: filebuf* rdbuf() const { return (filebuf*) ios::rdbuf(); }
75:
76: void attach(filedesc);
77: filedesc fd() const { return rdbuf()->fd(); }
78:
79: int is_open() const { return rdbuf()->is_open(); }
80: void open(const char *, int =ios::in, int = filebuf::openprot);
81: void close();
82: int setmode(int mode = filebuf::text) { return rdbuf()->setmode(mode); }
83: };
84:
85: class ofstream : public ostream {
86: public:
87: ofstream();
88: ofstream(const char *, int =ios::out, int = filebuf::openprot);
89: ofstream(filedesc);
90: ofstream(filedesc, char *, int);
91: ~ofstream();
92:
93: streambuf * setbuf(char *, int);
94: filebuf* rdbuf() const { return (filebuf*) ios::rdbuf(); }
95:
96: void attach(filedesc);
97: filedesc fd() const { return rdbuf()->fd(); }
98:
99: int is_open() const { return rdbuf()->is_open(); }
100: void open(const char *, int =ios::out, int = filebuf::openprot);
101: void close();
102: int setmode(int mode = filebuf::text) { return rdbuf()->setmode(mode); }
103: };
104:
105: class fstream : public iostream {
106: public:
107: fstream();
108: fstream(const char *, int, int = filebuf::openprot);
109: fstream(filedesc);
110: fstream(filedesc, char *, int);
111: ~fstream();
112:
113: streambuf * setbuf(char *, int);
114: filebuf* rdbuf() const { return (filebuf*) ostream::rdbuf(); }
115:
116: void attach(filedesc);
117: filedesc fd() const { return rdbuf()->fd(); }
118:
119: int is_open() const { return rdbuf()->is_open(); }
120: void open(const char *, int, int = filebuf::openprot);
121: void close();
122: int setmode(int mode = filebuf::text) { return rdbuf()->setmode(mode); }
123: };
124:
125: // manipulators to dynamically change file access mode (filebufs only)
126: inline ios& binary(ios& _fstrm) \
127: { ((filebuf*)_fstrm.rdbuf())->setmode(filebuf::binary); return _fstrm; }
128: inline ios& text(ios& _fstrm) \
129: { ((filebuf*)_fstrm.rdbuf())->setmode(filebuf::text); return _fstrm; }
130:
131: // Restore default packing
132: #pragma pack()
133:
134: #endif // !_INC_FSTREAM
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.