1: //stream_iterators.cpp 2: //Illustrates STL input and output stream iterators. 4: #include <iostream> 5: #include <fstream> 6: #include <vector> 7: #include <iterator> 8: #include <algorithm> 9: #include <cstdlib> 10: #include <cmath> 11: using namespace std; 13: int main() 14: { 15: cout << "\nThis program illustrates the use of input and output " 16: "stream iterators.\nFirst we look at output stream iterators."; 17: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 19: int odds[] = { 1, 3, 5, 7, 9 }; 20: int evens[] = { 2, 4, 6, 8, 10 }; 21: vector<int> v(5); 23: cout << "\nWe begin by displaying the contents of an array of " 24: "odd integers using the STL\ncopy algorithm and " 25: "and an \"anonymous\" output stream iterator:\n"; 26: copy (odds, odds+5, ostream_iterator<int>(cout, " ")); 27: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 29: cout << "\nNext we copy the values from an array of even integers " 30: "into a pre-sized vector\nof integers and then display the " 31: "contents of the vector in the same way:\n"; 32: copy(evens, evens+5, v.begin()); 33: copy (v.begin(), v.end(), ostream_iterator<int>(cout, " ")); 34: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 36: cout << "\nNow we display the same vector contents again, this " 37: "time using a named\noutput stream iterator which also " 38: "uses a different value separator:\n"; 39: ostream_iterator<int> outStream(cout, " | "); 40: copy (v.begin(), v.end(), outStream); 41: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 43: cout << "\nFinally, we copy odd integers from an array and " 44: "even integers from a vector\nto an output file and then " 45: "display the file to confirm. The odd integers are\noutput " 46: "one per line."; 47: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 48: ofstream outFile("stream_iterators.dat"); 49: copy(odds, odds+5, ostream_iterator<int>(outFile, "\n")); 50: copy(v.begin(), v.end(), ostream_iterator<int>(outFile, " ! ")); 51: outFile.close(); outFile.clear(); 52: cout << "\nHere are the contents of stream_iterators.dat:\n"; 53: system("type stream_iterators.dat | more"); //Portability alert! 54: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 56: cout << "\nNow we turn our attention to input stream iterators."; 57: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 59: cout << "\nFirst we read some integers entered from the keyboard, " 60: "using an anonymous\ninput stream iterator connected to the " 61: "standard input (the keyboard), and\ncopy those integers to a " 62: "vector, then display vector contents to confirm."; 63: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 64: cout << "\nEnter 5 integers (terminate with end-of-file " 65: "on a new line): "; 66: copy(istream_iterator<int>(cin), istream_iterator<int>(), v.begin()); 67: cin.clear(); 68: cout << "\nHere are the vector contents: "; 69: copy(v.begin(), v.end(), ostream_iterator<int>(cout, " ")); 70: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 72: cout << "\nNext we read some more integers entered from the " 73: "keyboard, write their square\nroots directly to a file, " 74: "then display the file to confirm."; 75: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 76: cout << "\nEnter any number of integers on the line below and " 77: "\nterminate with an end-of-file on a new line:\n"; 78: outFile.open("stream_iterators.dat"); 79: transform(istream_iterator<int>(cin), istream_iterator<int>(), 80: ostream_iterator<double>(outFile, "\n"), sqrt); 81: outFile.close(); outFile.clear(); 82: cin.clear(); 83: cout << "\nHere are the contents of the file:\n"; 84: system("type stream_iterators.dat | more"); //Portability alert! 85: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 87: cout << "\nNow we read the values from the previous output file, " 88: "and write the ceiling\nof each value to the standard output, " 89: "this time using named input and output\nstream iterators."; 90: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 91: ifstream inFile("stream_iterators.dat"); 92: istream_iterator<double> inStream(inFile); 93: istream_iterator<double> inStreamEOF; 94: ostream_iterator<int> outputStream(cout, " "); 95: cout << "\nHere are the resulting values:\n"; 96: transform(inStream, inStreamEOF, outputStream, ceil); 97: //___^___ 98: //Same as using istream_iterator<double>() here. 99: inFile.close(); inFile.clear(); 100: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 102: cout << "\nFinally, we simply display the contents of the file " 103: "stream_iterators.dat by\nincrementing an input stream " 104: "iterator connected to that file."; 105: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 106: inFile.open("stream_iterators.dat"); 107: istream_iterator<double> anotherInStream(inFile); 108: istream_iterator<double> anotherInStreamEOF; 109: cout << "\nHere are the values from the file:\n"; 110: while (anotherInStream != anotherInStreamEOF) 111: cout << *anotherInStream++ << " "; 112: inFile.close(); inFile.clear(); 113: cout << "\nPress Enter to continue ... "; cin.ignore(80, '\n'); 114: }