|
|
1.1 root 1: /*
2: Copyright (C) 1993 Free Software Foundation
3:
4: This file is part of the GNU IO Library. This library is free
5: software; you can redistribute it and/or modify it under the
6: terms of the GNU General Public License as published by the
7: Free Software Foundation; either version 2, or (at your option)
8: any later version.
9:
10: This library is distributed in the hope that it will be useful,
11: but WITHOUT ANY WARRANTY; without even the implied warranty of
12: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13: GNU General Public License for more details.
14:
15: You should have received a copy of the GNU General Public License
16: along with GNU CC; see the file COPYING. If not, write to
17: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
18:
19: As a special exception, if you link this library with files
20: compiled with a GNU compiler to produce an executable, this does not cause
21: the resulting executable to be covered by the GNU General Public License.
22: This exception does not however invalidate any other reasons why
23: the executable file might be covered by the GNU General Public License. */
24:
25: // This may look like C code, but it is really -*- C++ -*-
26:
27: /*
28: * a few tests for streams
29: *
30: */
31:
32: #include <stream.h>
33: #include <fstream.h>
34: #ifndef _OLD_STREAMS
35: #include <strstream.h>
36: #include "unistd.h"
37: #endif
38: #include <SFile.h>
39: #include <PlotFile.h>
40:
41: #include <stdio.h>
42: #include <stdlib.h>
43: #include <string.h>
44: #include <assert.h>
45:
46: class record
47: {
48: public:
49: char c; int i; double d;
50: };
51:
52: ostream& operator<<(ostream& s, record& r)
53: {
54: return(s << "(i = " << r.i << " c = " << r.c << " d = " << r.d << ")");
55: }
56:
57: void t1()
58: {
59: char ch;
60:
61: assert(cout.good());
62: assert(cout.writable());
63: assert(cout.is_open());
64: cout << "Hello, world via cout\n";
65: assert(cerr.good());
66: assert(cerr.writable());
67: assert(cerr.is_open());
68: cerr << "Hello, world via cerr\n";
69:
70: assert(cin.good());
71: assert(cin.readable());
72: assert(cin.is_open());
73:
74: cout << "enter a char:"; cin >> ch;
75: cout.put('c'); cout.put(' '); cout.put('='); cout.put(' ');
76: cout.put('"'); cout.put(ch); cout << '"'; cout << char('\n');
77: assert(cin.good());
78: assert(cout.good());
79: }
80:
81: void t2()
82: {
83: int i;
84: short h;
85: long l;
86: float f;
87: double d;
88: char s[100];
89:
90: cout << "enter three integers (short, int, long):";
91: cin >> h; cin >> i;
92: // cin.scan("%ld", &l);
93: cin >> l;
94: cout << "first = " << h << " via dec = " << dec(h, 8) << "\n";
95: cout << "second = " << i << form(" via form = %d = 0%o", i, i);
96: cout.form(" via cout.form = %d = 0x%x\n", i, i);
97: cout << "third = " << l << " via hex = " << hex(l) << "\n";
98: assert(cin.good());
99: assert(cout.good());
100:
101: cout << "enter a float then a double:"; cin >> f; cin >> d;
102: cout << "first = " << f << "\n";
103: cout << "second = " << d << "\n";
104: assert(cin.good());
105: assert(cout.good());
106:
107: cout << "enter 5 characters separated with spaces:"; cin >> s;
108: cout << "first = " << s << "\n";
109: cin.get(s, 100);
110: cout << "rest = " << s << "\n";
111:
112: assert(cin.good());
113:
114: cin.width(10);
115: cin >> s;
116: cin.clear();
117: cout << "A 10-character buffer: " << s << endl;
118:
119: assert(cout.good());
120:
121: }
122:
123: void t3()
124: {
125: char ch;
126: cout << "\nMaking streams sout and sin...";
127: #ifdef _OLD_STREAMS
128: ostream sout("streamfile", io_writeonly, a_create);
129: #else
130: ofstream sout("streamfile");
131: #endif
132: assert(sout.good());
133: assert(sout.is_open());
134: assert(sout.writable());
135: assert(!sout.readable());
136: sout << "This file has one line testing output streams.\n";
137: sout.close();
138: assert(!sout.is_open());
139: #ifdef _OLD_STREAMS
140: istream sin("streamfile", io_readonly, a_useonly);
141: #else
142: ifstream sin("streamfile");
143: #endif
144: assert(sin.good());
145: assert(sin.is_open());
146: assert(!sin.writable());
147: assert(sin.readable());
148: cout << "contents of file:\n";
149: while(sin >> ch) cout << ch;
150: sin.close();
151: assert(!sin.is_open());
152: }
153:
154:
155: void t4()
156: {
157: char s[100];
158: char ch;
159: int i;
160:
161: cout << "\nMaking File tf ... ";
162: #ifdef _OLD_STREAMS
163: File tf("tempfile", io_readwrite, a_create);
164: #else
165: fstream tf("tempfile", ios::in|ios::out|ios::trunc);
166: #endif
167: assert(tf.good());
168: assert(tf.is_open());
169: assert(tf.writable());
170: assert(tf.readable());
171: strcpy(s, "This is the first and only line of this file.\n");
172: #ifdef _OLD_STREAMS
173: tf.put(s);
174: tf.seek(0);
175: #else
176: tf << s;
177: tf.rdbuf()->seekoff(0, ios::beg);
178: #endif
179: tf.get(s, 100);
180: assert(tf.good());
181: cout << "first line of file:\n" << s << "\n";
182: cout << "next char = ";
183: tf.get(ch);
184: cout << (int)ch;
185: cout.put('\n');
186: assert(ch == 10);
187: strcpy(s, "Now there is a second line.\n");
188: cout << "reopening tempfile, appending: " << s;
189: #ifdef _OLD_STREAMS
190: tf.open(tf.name(), io_appendonly, a_use);
191: #else
192: tf.close();
193: tf.open("tempfile", ios::app);
194: #endif
195: assert(tf.good());
196: assert(tf.is_open());
197: assert(tf.writable());
198: assert(!tf.readable());
199: #ifdef _OLD_STREAMS
200: tf.put(s);
201: assert(tf.good());
202: tf.open(tf.name(), io_readonly, a_use);
203: #else
204: tf << s;
205: assert(tf.good());
206: tf.close();
207: tf.open("tempfile", ios::in);
208: #endif
209: tf.raw();
210: assert(tf.good());
211: assert(tf.is_open());
212: assert(!tf.writable());
213: assert(tf.readable());
214: cout << "First 10 chars via raw system read after reopen for input:\n";
215: read(tf.filedesc(), s, 10);
216: assert(tf.good());
217: for (i = 0; i < 10; ++ i)
218: cout.put(s[i]);
219: lseek(tf.filedesc(), 5, 0);
220: cout << "\nContents after raw lseek to pos 5:\n";
221: while ( (tf.get(ch)) && (cout.put(ch)) );
222: #ifdef _OLD_STREAMS
223: tf.remove();
224: #else
225: tf.close();
226: unlink("tempfile");
227: #endif
228: assert(!tf.is_open());
229: }
230:
231: void t5()
232: {
233: record r;
234: int i;
235: cout << "\nMaking SFile rf...";
236: #ifdef _OLD_STREAMS
237: SFile rf("recfile", sizeof(record), io_readwrite, a_create);
238: #else
239: SFile rf("recfile", sizeof(record), ios::in|ios::out|ios::trunc);
240: #endif
241: assert(rf.good());
242: assert(rf.is_open());
243: assert(rf.writable());
244: assert(rf.readable());
245: for (i = 0; i < 10; ++i)
246: {
247: r.c = i + 'a';
248: r.i = i;
249: r.d = (double)(i) / 1000.0;
250: rf.put(&r);
251: }
252: assert(rf.good());
253: cout << "odd elements of file in reverse order:\n";
254: for (i = 9; i >= 0; i -= 2)
255: {
256: rf[i].get(&r);
257: assert(r.c == i + 'a');
258: assert(r.i == i);
259: cout << r << "\n";
260: }
261: assert(rf.good());
262: #ifdef _OLD_STREAMS
263: rf.remove();
264: #else
265: rf.close();
266: unlink("recfile");
267: #endif
268: assert(!rf.is_open());
269: }
270:
271: void t6()
272: {
273: cout << "\nMaking PlotFile pf ...";
274: static const char plot_name[] = "plot.out";
275: PlotFile pf(plot_name);
276: assert(pf.good());
277: assert(pf.is_open());
278: assert(pf.writable());
279: assert(!pf.readable());
280: pf.move(10,10);
281: pf.label("Test");
282: pf.circle(300,300,200);
283: pf.line(100, 100, 500, 500);
284: assert(pf.good());
285: #ifdef _OLD_STREAMS
286: cout << "(You may delete or attempt to plot " << pf.name() << ")\n";
287: #else
288: cout << "(You may delete or attempt to plot " << plot_name << ")\n";
289: #endif
290: }
291:
292: void t7()
293: {
294: char ch;
295: static char t7_line1[] = "This is a string-based stream.\n";
296: static char t7_line2[] = "With two lines.\n";
297: char mybuf[60];
298: char *bufp;
299: #ifdef _OLD_STREAMS
300: cout << "creating string-based ostream...\n";
301: ostream strout(60, mybuf);
302: #else
303: cout << "creating ostrstream...\n";
304: ostrstream strout(mybuf, 60);
305: #endif
306: assert(strout.good());
307: assert(strout.writable());
308: strout << t7_line1 << t7_line2 << ends;
309: assert(strout.good());
310: cout << "with contents:\n";
311: bufp = strout.str();
312: assert(bufp == mybuf);
313: strout.rdbuf()->freeze(0); /* Should be a no-op */
314: cout << mybuf;
315: #ifdef _OLD_STREAMS
316: cout << "using it to create string-based istream...\n";
317: istream strin(strlen(mybuf), mybuf);
318: #else
319: cout << "using it to create istrstream...\n";
320: istrstream strin(mybuf, strlen(mybuf));
321: #endif
322: assert(strin.good());
323: assert(strin.readable());
324: cout << "with contents:\n";
325: #ifndef _OLD_STREAMS
326: char line[100];
327: strin.getline(line, 100);
328: int line1_len = strlen(t7_line1);
329: assert(strin.tellg() == line1_len);
330: int line_len = strin.gcount();
331: assert(line_len == line1_len);
332: cout.write(line, line1_len-1);
333: cout << endl;
334: #endif
335: while (strin.get(ch)) cout.put(ch);
336:
337: strstream str1;
338: strstream str2;
339: str1 << "Testing string-based stream using strstream.\n";
340: str1.seekg(0);
341: for (;;) {
342: int i = str1.get();
343: if (i == EOF)
344: break;
345: str2 << (char)i;
346: }
347: str2 << ends;
348: cout << str2.str();
349:
350: // This should make it overflow.
351: strout << t7_line1;
352: assert (strout.bad());
353: }
354:
355: void t8()
356: {
357: #ifdef _OLD_STREAMS
358: cout << "\nThe following file open should generate error message:";
359: cout.flush();
360: File ef("shouldnotexist", io_readonly, a_useonly);
361: #else
362: ifstream ef("shouldnotexist");
363: #endif
364: assert(!ef.good());
365: assert(!ef.is_open());
366: }
367:
368: void t9()
369: {
370: char ch;
371: static char ffile_name[] = "ftmp";
372: {
373: cout << "\nMaking filebuf streams fout and fin...";
374: filebuf foutbuf;
375: #ifdef _OLD_STREAMS
376: foutbuf.open(ffile_name, output);
377: #else
378: foutbuf.open(ffile_name, ios::out);
379: #endif
380: ostream fout(&foutbuf);
381: assert(fout.good());
382: assert(fout.is_open());
383: assert(fout.writable());
384: assert(!fout.readable());
385: fout << "This file has one line testing output streams.\n";
386: #ifdef _OLD_STREAMS
387: fout.close();
388: assert(!fout.is_open());
389: #endif
390: }
391: filebuf finbuf;
392: #ifdef _OLD_STREAMS
393: finbuf.open(ffile_name, input);
394: #else
395: finbuf.open(ffile_name, ios::in);
396: #endif
397: istream fin(&finbuf);
398: assert(fin.good());
399: assert(fin.is_open());
400: assert(!fin.writable());
401: assert(fin.readable());
402: cout << "contents of file:\n";
403: while(fin >> ch) cout << ch;
404: #ifndef _OLD_STREAMS
405: cout << '\n';
406: #endif
407: fin.close();
408: assert(!fin.is_open());
409: }
410:
411: void t10()
412: {
413: int fileCnt = 3;
414: char *file_name_pattern = "ftmp%d";
415: char current_file_name[50];
416: ifstream inFile;
417: ofstream outFile;
418: char c;
419: int i;
420:
421: cout << '\n';
422:
423: // Write some files.
424: for (i=0; i < fileCnt; i++) {
425: sprintf(current_file_name, file_name_pattern, i);
426: outFile.open(current_file_name, ios::out);
427:
428: if ( outFile.fail() )
429: cerr << "File " << current_file_name
430: << " can't be opened for output" << endl;
431: else {
432: outFile << "This is line 1 of " << current_file_name << '\n';
433: outFile << "This is line 2 of " << current_file_name << endl;
434: outFile.close();
435: }
436: }
437:
438: // Now read the files back in, and write then out to cout.
439: for (i=0; i < fileCnt; i++) {
440: sprintf(current_file_name, file_name_pattern, i);
441: inFile.open(current_file_name, ios::in);
442:
443:
444: if ( inFile.fail() )
445: cerr << "File " << current_file_name
446: << " can't be opened for input" << endl;
447: else {
448: while ( inFile.get (c))
449: cout << c;
450: cout << endl;
451: inFile.close();
452: }
453: }
454: }
455:
456: // Test form
457:
458: void t11()
459: {
460: int count1, count2;
461: cout.form("%.2f+%.2f = %4.3e\n%n", 5.5, 6.25, 5.5+6.25, &count1);
462: char *text = "Previous line has12345";
463: char text_length_to_use = strlen(text) - 5;
464: count2 = cout.rdbuf()->form("%-*.*s%3g characters\n",
465: text_length_to_use + 1,
466: text_length_to_use,
467: text,
468: (double)(count1-1));
469: cout.form("%-*.*s%+d characters\n%n",
470: text_length_to_use + 1, text_length_to_use, text,
471: count2-1, &count1);
472: assert(count1 == 33);
473: }
474:
475: main(int argc, char **argv)
476: {
477: if (argc > 1 && strncmp(argv[1], "-b", 2) == 0) {
478: streambuf *sb = cout.rdbuf();
479: streambuf *ret;
480: int buffer_size = atoi(&argv[1][2]);
481: if (buffer_size == 0)
482: ret = sb->setbuf(NULL, 0);
483: else
484: ret = sb->setbuf(new char[buffer_size], buffer_size);
485: if (ret != sb)
486: cerr << "Warning: cout.rdbuf()->setbuf failed!\n";
487: }
488: t1();
489: t2();
490: t3();
491: t4();
492: t5();
493: t6();
494: t7();
495: t9();
496: t8();
497: t10();
498: t11();
499:
500: cout << "Final names & states:\n";
501: #ifdef _OLD_STREAMS
502: cout << "cin: " << cin.name() << "\t" << cin.rdstate() << "\n";
503: cout << "cout: " << cout.name() << "\t" << cout.rdstate() << "\n";
504: cout << "cerr: " << cerr.name() << "\t" << cerr.rdstate() << "\n";
505: #else
506: cout << "cin: " << "(stdin)" << "\t" << cin.rdstate() << "\n";
507: cout << "cout: " << "(stdout)" << "\t" << cout.rdstate() << "\n";
508: cout << "cerr: " << "(stderr)" << "\t" << cerr.rdstate() << "\n";
509: #endif
510: cout << "\nend of test.\n";
511: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.