|  | /* | 
|  | Copyright (C) 1993 Free Software Foundation | 
|  |  | 
|  | This file is part of the GNU IO 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 2, 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 this library; see the file COPYING.  If not, write to the Free | 
|  | Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. | 
|  |  | 
|  | As a special exception, if you link this library with files | 
|  | compiled with a GNU compiler to produce an executable, this does not cause | 
|  | the resulting executable to be covered by the GNU General Public License. | 
|  | This exception does not however invalidate any other reasons why | 
|  | the executable file might be covered by the GNU General Public License. */ | 
|  |  | 
|  | // This may look like C code, but it is really -*- C++ -*- | 
|  |  | 
|  | /* | 
|  | * a few tests for streams | 
|  | * | 
|  | */ | 
|  |  | 
|  | #include <stream.h> | 
|  | #include <fstream.h> | 
|  | #ifndef _OLD_STREAMS | 
|  | #include <strstream.h> | 
|  | #include "unistd.h" | 
|  | #endif | 
|  | #include <SFile.h> | 
|  | #include <PlotFile.h> | 
|  |  | 
|  | #include <stdio.h> | 
|  | #include <stdlib.h> | 
|  | #include <string.h> | 
|  | #include <assert.h> | 
|  |  | 
|  | const char *tempfile; | 
|  |  | 
|  | class record | 
|  | { | 
|  | public: | 
|  | char c; int i; double d; | 
|  | }; | 
|  |  | 
|  | ostream& operator<<(ostream& s, record& r) | 
|  | { | 
|  | return(s << "(i = " << r.i << " c = " << r.c << " d = " << r.d << ")"); | 
|  | } | 
|  |  | 
|  | void t1() | 
|  | { | 
|  | char ch; | 
|  |  | 
|  | assert(cout.good()); | 
|  | assert(cout.writable()); | 
|  | assert(cout.is_open()); | 
|  | cout << "Hello, world via cout\n"; | 
|  | assert(cerr.good()); | 
|  | assert(cerr.writable()); | 
|  | assert(cerr.is_open()); | 
|  | cerr << "Hello, world via cerr\n"; | 
|  |  | 
|  | assert(cin.good()); | 
|  | assert(cin.readable()); | 
|  | assert(cin.is_open()); | 
|  |  | 
|  | cout << "enter a char:";  cin >> ch; | 
|  | cout.put('c');  cout.put(' ');  cout.put('=');  cout.put(' '); | 
|  | cout.put('"');  cout.put(ch);    cout << '"';  cout << char('\n'); | 
|  | assert(cin.good()); | 
|  | assert(cout.good()); | 
|  | } | 
|  |  | 
|  | void t2() | 
|  | { | 
|  | int i; | 
|  | short h; | 
|  | long l; | 
|  | float f; | 
|  | double d; | 
|  | char s[100]; | 
|  |  | 
|  | cout << "enter three integers (short, int, long):"; | 
|  | cin >> h; cin >> i; | 
|  | // cin.scan("%ld", &l); | 
|  | cin >> l; | 
|  | cout << "first  = " << h << " via dec = " << dec(h, 8) << "\n"; | 
|  | cout << "second = " << i << form(" via form = %d = 0%o", i, i); | 
|  | cout.form(" via cout.form = %d = 0x%x\n", i, i); | 
|  | cout << "third  = " << l  << " via hex = " << hex(l) << "\n"; | 
|  | assert(cin.good()); | 
|  | assert(cout.good()); | 
|  |  | 
|  | cout << "enter a float then a double:";  cin >> f; cin >> d; | 
|  | cout << "first  = " << f << "\n"; | 
|  | cout << "second = " << d << "\n"; | 
|  | assert(cin.good()); | 
|  | assert(cout.good()); | 
|  |  | 
|  | cout << "enter 5 characters separated with spaces:";  cin >> s; | 
|  | cout << "first  = " << s << "\n"; | 
|  | cin.get(s, 100); | 
|  | cout << "rest   = " << s << "\n"; | 
|  |  | 
|  | assert(cin.good()); | 
|  |  | 
|  | cin.width(10); | 
|  | cin >> s; | 
|  | cin.clear(); | 
|  | cout << "A 10-character buffer: " << s << endl; | 
|  |  | 
|  | assert(cout.good()); | 
|  |  | 
|  | } | 
|  |  | 
|  | void t3() | 
|  | { | 
|  | char ch; | 
|  | cout << "\nMaking streams sout and sin..."; | 
|  | #ifdef _OLD_STREAMS | 
|  | ostream sout("streamfile", io_writeonly, a_create); | 
|  | #else | 
|  | ofstream sout("streamfile"); | 
|  | #endif | 
|  | assert(sout.good()); | 
|  | assert(sout.is_open()); | 
|  | assert(sout.writable()); | 
|  | assert(!sout.readable()); | 
|  | sout << "This file has one line testing output streams.\n"; | 
|  | sout.close(); | 
|  | assert(!sout.is_open()); | 
|  | #ifdef _OLD_STREAMS | 
|  | istream sin("streamfile", io_readonly, a_useonly); | 
|  | #else | 
|  | ifstream sin("streamfile"); | 
|  | #endif | 
|  | assert(sin.good()); | 
|  | assert(sin.is_open()); | 
|  | assert(!sin.writable()); | 
|  | assert(sin.readable()); | 
|  | cout << "contents of file:\n"; | 
|  | while(sin >> ch) cout << ch; | 
|  | sin.close(); | 
|  | assert(!sin.is_open()); | 
|  | } | 
|  |  | 
|  |  | 
|  | void t4() | 
|  | { | 
|  | char s[100]; | 
|  | char ch; | 
|  | int i; | 
|  |  | 
|  | cout << "\nMaking File tf ... "; | 
|  | #ifdef _OLD_STREAMS | 
|  | File tf(tempfile, io_readwrite, a_create); | 
|  | #else | 
|  | fstream tf(tempfile, ios::in|ios::out|ios::trunc); | 
|  | #endif | 
|  | assert(tf.good()); | 
|  | assert(tf.is_open()); | 
|  | assert(tf.writable()); | 
|  | assert(tf.readable()); | 
|  | strcpy(s, "This is the first and only line of this file.\n"); | 
|  | #ifdef _OLD_STREAMS | 
|  | tf.put(s); | 
|  | tf.seek(0); | 
|  | #else | 
|  | tf << s; | 
|  | tf.rdbuf()->seekoff(0, ios::beg); | 
|  | #endif | 
|  | tf.get(s, 100); | 
|  | assert(tf.good()); | 
|  | cout << "first line of file:\n" << s << "\n"; | 
|  | cout << "next char = "; | 
|  | tf.get(ch); | 
|  | cout << (int)ch; | 
|  | cout.put('\n'); | 
|  | assert(ch == 10); | 
|  | strcpy(s, "Now there is a second line.\n"); | 
|  | cout << "reopening tempfile, appending: " << s; | 
|  | #ifdef _OLD_STREAMS | 
|  | tf.open(tf.name(), io_appendonly, a_use); | 
|  | #else | 
|  | tf.close(); | 
|  | tf.open(tempfile, ios::app); | 
|  | #endif | 
|  | assert(tf.good()); | 
|  | assert(tf.is_open()); | 
|  | assert(tf.writable()); | 
|  | assert(!tf.readable()); | 
|  | #ifdef _OLD_STREAMS | 
|  | tf.put(s); | 
|  | assert(tf.good()); | 
|  | tf.open(tf.name(), io_readonly, a_use); | 
|  | #else | 
|  | tf << s; | 
|  | assert(tf.good()); | 
|  | tf.close(); | 
|  | tf.open(tempfile, ios::in); | 
|  | #endif | 
|  | tf.raw(); | 
|  | assert(tf.good()); | 
|  | assert(tf.is_open()); | 
|  | assert(!tf.writable()); | 
|  | assert(tf.readable()); | 
|  | cout << "First 10 chars via raw system read after reopen for input:\n"; | 
|  | read(tf.filedesc(), s, 10); | 
|  | assert(tf.good()); | 
|  | for (i = 0; i < 10; ++ i) | 
|  | cout.put(s[i]); | 
|  | lseek(tf.filedesc(), 5, 0); | 
|  | cout << "\nContents after raw lseek to pos 5:\n"; | 
|  | while ( (tf.get(ch)) && (cout.put(ch)) ); | 
|  | #ifdef _OLD_STREAMS | 
|  | tf.remove(); | 
|  | #else | 
|  | tf.close(); | 
|  | unlink((char*)tempfile); | 
|  | #endif | 
|  | assert(!tf.is_open()); | 
|  | } | 
|  |  | 
|  | void t5() | 
|  | { | 
|  | record r; | 
|  | int i; | 
|  | cout << "\nMaking SFile rf..."; | 
|  | #ifdef _OLD_STREAMS | 
|  | SFile rf("recfile", sizeof(record), io_readwrite, a_create); | 
|  | #else | 
|  | SFile rf("recfile", sizeof(record), ios::in|ios::out|ios::trunc); | 
|  | #endif | 
|  | assert(rf.good()); | 
|  | assert(rf.is_open()); | 
|  | assert(rf.writable()); | 
|  | assert(rf.readable()); | 
|  | for (i = 0; i < 10; ++i) | 
|  | { | 
|  | r.c = i + 'a'; | 
|  | r.i = i; | 
|  | r.d = (double)(i) / 1000.0; | 
|  | rf.put(&r); | 
|  | } | 
|  | assert(rf.good()); | 
|  | cout << "odd elements of file in reverse order:\n"; | 
|  | for (i = 9; i >= 0; i -= 2) | 
|  | { | 
|  | rf[i].get(&r); | 
|  | assert(r.c == i + 'a'); | 
|  | assert(r.i == i); | 
|  | cout << r << "\n"; | 
|  | } | 
|  | assert(rf.good()); | 
|  | #ifdef _OLD_STREAMS | 
|  | rf.remove(); | 
|  | #else | 
|  | rf.close(); | 
|  | unlink("recfile"); | 
|  | #endif | 
|  | assert(!rf.is_open()); | 
|  | } | 
|  |  | 
|  | void t6() | 
|  | { | 
|  | cout << "\nMaking PlotFile pf ..."; | 
|  | static const char plot_name[] = "plot.out"; | 
|  | PlotFile pf(plot_name); | 
|  | assert(pf.good()); | 
|  | assert(pf.is_open()); | 
|  | assert(pf.writable()); | 
|  | assert(!pf.readable()); | 
|  | pf.move(10,10); | 
|  | pf.label("Test"); | 
|  | pf.circle(300,300,200); | 
|  | pf.line(100, 100, 500, 500); | 
|  | assert(pf.good()); | 
|  | #ifdef _OLD_STREAMS | 
|  | cout << "(You may delete or attempt to plot " << pf.name() << ")\n"; | 
|  | #else | 
|  | cout << "(You may delete or attempt to plot " << plot_name << ")\n"; | 
|  | #endif | 
|  | } | 
|  |  | 
|  | void t7() | 
|  | { | 
|  | char ch; | 
|  | static char t7_line1[] = "This is a string-based stream.\n"; | 
|  | static char t7_line2[] = "With two lines.\n"; | 
|  | char mybuf[60]; | 
|  | char *bufp; | 
|  | #ifdef _OLD_STREAMS | 
|  | cout << "creating string-based ostream...\n"; | 
|  | ostream strout(60, mybuf); | 
|  | #else | 
|  | cout << "creating ostrstream...\n"; | 
|  | ostrstream strout(mybuf, 60); | 
|  | #endif | 
|  | assert(strout.good()); | 
|  | assert(strout.writable()); | 
|  | strout << t7_line1 << t7_line2 << ends; | 
|  | assert(strout.good()); | 
|  | cout << "with contents:\n"; | 
|  | bufp = strout.str(); | 
|  | assert(bufp == mybuf); | 
|  | strout.rdbuf()->freeze(0); /* Should be a no-op */ | 
|  | cout << mybuf; | 
|  | #ifdef _OLD_STREAMS | 
|  | cout << "using it to create string-based istream...\n"; | 
|  | istream strin(strlen(mybuf), mybuf); | 
|  | #else | 
|  | cout << "using it to create istrstream...\n"; | 
|  | istrstream strin(mybuf, strlen(mybuf)); | 
|  | #endif | 
|  | assert(strin.good()); | 
|  | assert(strin.readable()); | 
|  | cout << "with contents:\n"; | 
|  | #ifndef _OLD_STREAMS | 
|  | char line[100]; | 
|  | strin.getline(line, 100); | 
|  | int line1_len = strlen(t7_line1); | 
|  | assert(strin.tellg() == line1_len); | 
|  | int line_len = strin.gcount(); | 
|  | assert(line_len == line1_len); | 
|  | cout.write(line, line1_len - 1); | 
|  | cout << endl; | 
|  | #endif | 
|  | while (strin.get(ch)) cout.put(ch); | 
|  |  | 
|  | strstream str1; | 
|  | strstream str2; | 
|  | str1 << "Testing string-based stream using strstream.\n"; | 
|  | str1.seekg(0); | 
|  | for (;;) { | 
|  | int i = str1.get(); | 
|  | if (i == EOF) | 
|  | break; | 
|  | str2 << (char)i; | 
|  | } | 
|  | str2 << ends; | 
|  | cout << str2.str(); | 
|  |  | 
|  | // This should make it overflow. | 
|  | strout << t7_line1; | 
|  | assert (strout.bad()); | 
|  | } | 
|  |  | 
|  | void t8() | 
|  | { | 
|  | #ifdef _OLD_STREAMS | 
|  | cout << "\nThe following file open should generate error message:"; | 
|  | cout.flush(); | 
|  | File ef("shouldnotexist", io_readonly, a_useonly); | 
|  | #else | 
|  | ifstream ef("shouldnotexist"); | 
|  | #endif | 
|  | assert(!ef.good()); | 
|  | assert(!ef.is_open()); | 
|  | } | 
|  |  | 
|  | void t9() | 
|  | { | 
|  | char ch; | 
|  | static char ffile_name[] = "ftmp"; | 
|  | { | 
|  | cout << "\nMaking filebuf streams fout and fin..."; | 
|  | filebuf foutbuf; | 
|  | #ifdef _OLD_STREAMS | 
|  | foutbuf.open(ffile_name, output); | 
|  | #else | 
|  | foutbuf.open(ffile_name, ios::out); | 
|  | #endif | 
|  | ostream fout(&foutbuf); | 
|  | assert(fout.good()); | 
|  | assert(fout.is_open()); | 
|  | assert(fout.writable()); | 
|  | assert(!fout.readable()); | 
|  | fout << "This file has one line testing output streams.\n"; | 
|  | #ifdef _OLD_STREAMS | 
|  | fout.close(); | 
|  | assert(!fout.is_open()); | 
|  | #endif | 
|  | } | 
|  | filebuf finbuf; | 
|  | #ifdef _OLD_STREAMS | 
|  | finbuf.open(ffile_name, input); | 
|  | #else | 
|  | finbuf.open(ffile_name, ios::in); | 
|  | #endif | 
|  | istream fin(&finbuf); | 
|  | assert(fin.good()); | 
|  | assert(fin.is_open()); | 
|  | assert(!fin.writable()); | 
|  | assert(fin.readable()); | 
|  | cout << "contents of file:\n"; | 
|  | while(fin >> ch) cout << ch; | 
|  | #ifndef _OLD_STREAMS | 
|  | cout << '\n'; | 
|  | #endif | 
|  | fin.close(); | 
|  | assert(!fin.is_open()); | 
|  | } | 
|  |  | 
|  | void t10() | 
|  | { | 
|  | int fileCnt = 3; | 
|  | char *file_name_pattern = "ftmp%d"; | 
|  | char current_file_name[50]; | 
|  | ifstream inFile; | 
|  | ofstream outFile; | 
|  | char c; | 
|  | int i; | 
|  |  | 
|  | cout << '\n'; | 
|  |  | 
|  | // Write some files. | 
|  | for (i=0; i < fileCnt; i++)   { | 
|  | sprintf(current_file_name, file_name_pattern, i); | 
|  | outFile.open(current_file_name, ios::out); | 
|  |  | 
|  | if ( outFile.fail() ) | 
|  | cerr << "File " << current_file_name | 
|  | << " can't be opened for output" << endl; | 
|  | else { | 
|  | outFile << "This is line 1 of " << current_file_name << '\n'; | 
|  | outFile << "This is line 2 of " << current_file_name << endl; | 
|  | outFile.close(); | 
|  | } | 
|  | } | 
|  |  | 
|  | // Now read the files back in, and write then out to cout. | 
|  | for (i=0; i < fileCnt; i++)   { | 
|  | sprintf(current_file_name, file_name_pattern, i); | 
|  | inFile.open(current_file_name, ios::in); | 
|  |  | 
|  |  | 
|  | if ( inFile.fail() ) | 
|  | cerr << "File " << current_file_name | 
|  | << " can't be opened for input" << endl; | 
|  | else { | 
|  | while ( inFile.get (c)) | 
|  | cout << c; | 
|  | cout << endl; | 
|  | inFile.close(); | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | // Test form | 
|  |  | 
|  | void t11() | 
|  | { | 
|  | int count1, count2; | 
|  | cout.form("%.2f+%.2f = %4.3e\n%n", 5.5, 6.25, 5.5+6.25, &count1); | 
|  | char *text = "Previous line has12345"; | 
|  | char text_length_to_use = strlen(text) - 5; | 
|  | count2 = cout.rdbuf()->form("%-*.*s%3g characters\n", | 
|  | text_length_to_use + 1, | 
|  | text_length_to_use, | 
|  | text, | 
|  | (double)(count1-1)); | 
|  | cout.form("%-*.*s%+d characters\n%n", | 
|  | text_length_to_use + 1, text_length_to_use, text, | 
|  | count2-1, &count1); | 
|  | assert(count1 == 33); | 
|  | } | 
|  |  | 
|  | static void | 
|  | show_int (long val) | 
|  | { | 
|  | cout.setf(ios::showbase); | 
|  | cout << dec; cout.width (8); cout << val << "(dec) = "; | 
|  | cout << hex; cout.width (8); cout << (0xFFFF & val) << "(hex) = "; | 
|  | cout << oct; cout.width (8); | 
|  | cout << (0xFFFF & val) << "(oct) [showbase on]\n"; | 
|  | cout.unsetf(ios::showbase); | 
|  | cout << dec; cout.width (8); cout << val << "(dec) = "; | 
|  | cout << hex; cout.width (8); cout << (0xFFFF & val) << "(hex) = "; | 
|  | cout << oct; cout.width (8); | 
|  | cout << (0xFFFF & val) << "(oct) [showbase off]\n"; | 
|  | } | 
|  |  | 
|  | void | 
|  | t12 () | 
|  | { | 
|  | ios::fmtflags old_flags = cout.setf(ios::showpos); | 
|  | int fill = cout.fill('_'); | 
|  | cout.unsetf(ios::uppercase); | 
|  | cout.setf(ios::internal, ios::adjustfield); | 
|  | show_int(34567); | 
|  | show_int(-34567); | 
|  | cout.setf(ios::right, ios::adjustfield); | 
|  | show_int(0); | 
|  | cout.setf(ios::uppercase); | 
|  | cout.unsetf(ios::showpos); | 
|  | show_int(34567); | 
|  | cout.setf(ios::left, ios::adjustfield); | 
|  | show_int(-34567); | 
|  | cout.fill(fill); | 
|  | show_int(0); | 
|  | cout.setf(old_flags, | 
|  | ios::adjustfield|ios::basefield | 
|  | |ios::showbase|ios::showpos|ios::uppercase); | 
|  | } | 
|  |  | 
|  | main(int argc, char **argv) | 
|  | { | 
|  | char temp [1024] = "tempfile"; | 
|  |  | 
|  | if (argc > 1 && strncmp(argv[1], "-b", 2) == 0) { | 
|  | streambuf *sb = cout.rdbuf(); | 
|  | streambuf *ret; | 
|  | int buffer_size = atoi(&argv[1][2]); | 
|  | if (buffer_size == 0) | 
|  | ret = sb->setbuf(NULL, 0); | 
|  | else | 
|  | ret = sb->setbuf(new char[buffer_size], buffer_size); | 
|  | if (ret != sb) | 
|  | cerr << "Warning: cout.rdbuf()->setbuf failed!\n"; | 
|  |  | 
|  | strncpy (&temp [8], &argv[1][2], 1000); | 
|  | temp [1008] = '\0'; | 
|  | } | 
|  | tempfile = temp; | 
|  | t1(); | 
|  | t2(); | 
|  | t3(); | 
|  | t4(); | 
|  | t5(); | 
|  | t6(); | 
|  | t7(); | 
|  | t9(); | 
|  | t8(); | 
|  | t10(); | 
|  | t11(); | 
|  | t12(); | 
|  |  | 
|  | cout << "Final names & states:\n"; | 
|  | #ifdef _OLD_STREAMS | 
|  | cout << "cin:      " << cin.name()  << "\t" << cin.rdstate() << "\n"; | 
|  | cout << "cout:     " << cout.name() << "\t" << cout.rdstate() << "\n"; | 
|  | cout << "cerr:     " << cerr.name() << "\t" << cerr.rdstate() << "\n"; | 
|  | #else | 
|  | cout << "cin:      " << "(stdin)"  << "\t" << cin.rdstate() << "\n"; | 
|  | cout << "cout:     " << "(stdout)" << "\t" << cout.rdstate() << "\n"; | 
|  | cout << "cerr:     " << "(stderr)" << "\t" << cerr.rdstate() << "\n"; | 
|  | #endif | 
|  | cout << "\nend of test.\n"; | 
|  | } |