Chapter 10 Input/Output Streams

Slides:



Advertisements
Similar presentations
Chapter 10 Input/Output Streams
Advertisements

File Operations Functions Manipulating Files. Review The fstream library defines two classes: ifstream, for creating connections between programs and.
CS 1620 File I/O. So far this semester all input has been from keyboard all output has been to computer screen these are just two examples of where to.
1 Lecture 31 Handling Selected Topics Again!! File I/O Special Lectures.
CS-212 C++ I/O Dick Steflik. C++ I/O Modeled after UNIX’s concept of a “stream” –conceptionally a stream is a continuous flow of characters/bytes from.
計算機概論實習 Stream Stream: sequence of bytes Input: from device (keyboard, disk drive) to memory Output: from memory to device (monitor, printer,
1 Lecture 5: Input/Output (I) Introduction to Computer Science Spring 2006.
How to Program in C++ CHAPTER 3: INPUT & OUTPUT INSTRUCTOR: MOHAMMAD MOJADDAM.
1 10/25/06CS150 Introduction to Computer Science 1 Reading from and Writing to Files.
Chapter 3: Input/Output
Streams, Files. 2 Stream Stream is a sequence of bytes Input stream In input operations, the bytes are transferred from a device to the main memory Output.
Chapter 11 Customizing I/O Bjarne Stroustrup
STREAMS AND FILES OVERVIEW.  Many programs are "data processing" applications  Read the input data  Perform sequence of operations on this data  Write.
Chapter 6 Writing a Program John Keyser’s Modification of Slides by Bjarne Stroustrup
Chapter 10 Input/Output Streams John Keyser’s Modifications of Slides by Bjarne Stroustrup
File I/O ifstreams and ofstreams Sections 11.1 &
1 Streams In C++, I/O occurs in streams. A stream is a sequence of bytes Each I/O device (e.g. keyboard, mouse, monitor, hard disk, printer, etc.) receives.
1 CS161 Introduction to Computer Science Topic #13.
File Input and Output in C++. Keyboard and Screen I/O #include cin (of type istream) cout (of type ostream) Keyboard Screen executing program input data.
Introduction to C++ Version 1.1. Topics C++ Structure Primitive Data Types I/O Casting Strings Control Flow.
Slides adapted from: Bjarne Stroustrup, Programming – Principles and Practice using C++ Chapter 10 Input/Output Streams Hartmut Kaiser
File I/O 1 ifstreams and ofstreams Sections 11.1 & 11.2.
Slides adapted from: Bjarne Stroustrup, Programming – Principles and Practice using C++ Chapter 6 Writing a Program Hartmut Kaiser
Lecture Contents I/O Streams. –Input/output streams. –Unformatted vs formatted streams. –Stream manipulators. –Stream error state. –Stream tying. –Examples.
 2000 Prentice Hall, Inc. All rights reserved. Chapter 21 - C++ Stream Input/Output Basics Outline 21.1Introduction 21.2Streams Iostream Library.
Chapter 3: Input/Output
Chapter 3: Input/Output. Objectives In this chapter, you will: – Learn what a stream is and examine input and output streams – Explore how to read data.
Prof. amr Goneid, AUC1 CSCE 110 PROGRAMMING FUNDAMENTALS WITH C++ Prof. Amr Goneid AUC Part 9. Streams & Files.
CSCE 121: Introduction to Program Design and Concepts Dr. J. Michael Moore Spring Fall 2016 Set 10: Input/Output Streams 1 Based on slides created.
Input/Output. Objectives In this chapter you will: Learn what a stream is and examine input and output streams Explore how to use the input stream functions.
Exploring the C++ Stream Library Copyright 2006 Oxford Consulting, Ltd1 February IO Streams  IOStreams are part of the Standard C++ library.
CS162 External Data Files 1 Today in CS162 External Files What is an external file? How do we save data in a file?
Files To read a file – We must know its name – We must open it (for reading) – Then we can read – Then we must close it That is typically done implicitly.
24 4/11/98 CSE 143 Stream I/O [Appendix C]. 25 4/11/98 Input/Output Concepts  Concepts should be review!  New syntax, but same fundamental concepts.
Slides adapted from: Bjarne Stroustrup, Programming – Principles and Practice using C++ Chapter 10 Input/Output Streams Hartmut Kaiser
File I/O in C++ I. Using Input/Output Files A computer file is stored on a secondary storage device (e.g., disk); is permanent; can be used to provide.
© Janice Regan, CMPT 128, Jan CMPT 128: Introduction to Computing Science for Engineering Students File Input and Output Checking input for errors.
Chapter 6 Writing a Program Bjarne Stroustrup
C++ for Everyone by Cay Horstmann Copyright © 2012 by John Wiley & Sons. All rights reserved Chapter Eight: Streams Slides by Evan Gallagher.
Chapter 3: Input/Output. Objectives In this chapter, you will: – Learn what a stream is and examine input and output streams – Explore how to read data.
Introduction Every program takes some data as input and generate processed data as out put . It is important to know how to provide the input data and.
Exceptions.
ifstreams and ofstreams
Chapter 1.2 Introduction to C++ Programming
Functions Manipulating Files
Why exception handling in C++?
What is a File? A file is a collection on information, usually stored on a computer’s disk. Information can be saved to files and then later reused.
Basic Input and Output Operations
Copyright © 2003 Pearson Education, Inc.
Chapter 11 Customizing I/O
Input and Output Chapter 3.
File I/O.
Some Basics for Problem Analysis and Solutions
Lecture 5A File processing Richard Gesick.
Today in CS161 Week #3 Learn about… Writing our First Program
Basic File I/O and Stream Objects
IO Overview CSCE 121 J. Michael Moore
Chapter 3: Input/Output
Chapter 3 Input output.
CSC 143 Stream I/O Classes and Files [A11-A15, A38-A50]
Chapter 11 Customizing I/O
File I/O in C++ I.
Chapter 10 Input/Output Streams
Chapter 11 Customizing I/O
Reading from and Writing to Files
ifstreams and ofstreams
IO Overview CSCE 121 Strongly influenced by slides created by Bjarne Stroustrup and Jennifer Welch.
File I/O in C++ I.
Reading from and Writing to Files
Presentation transcript:

Chapter 10 Input/Output Streams Bjarne Stroustrup www.stroustrup.com/Programming

Overview Fundamental I/O concepts Files I/O errors Opening Reading and writing streams I/O errors Reading a single integer Stroustrup/Programming/2015

Input and Output our program input device device driver input library output library output device data source: data destination: Stroustrup/Programming/2015

The stream model: views a continuous stream of flow of data “somewhere” ostream (1,234) 123 buffer An ostream turns values of various types into character sequences sends those characters somewhere E.g., console, file, main memory, another computer Stroustrup/Programming/2015

The stream model: views a continuous stream of flow of data “somewhere” istream (1,234) 123 buffer An istream turns character sequences into values of various types gets those characters from somewhere E.g., console, file, main memory, another computer Stroustrup/Programming/2015

The stream model Reading and writing Of typed entities << (output) and >> (input) plus other operations Type safe Formatted Typically stored (entered, printed, etc.) as text But not necessarily (see binary streams in chapter 11) Extensible You can define your own I/O operations for your own types A stream can be attached to any I/O or storage device Stroustrup/Programming/2015

Files We turn our computers on and off We like to keep our data The contents of our main memory is transient We like to keep our data So we keep what we want to preserve on disks and similar permanent storage A file is a sequence of bytes stored in permanent storage A file has a name The data on a file has a format We can read/write a file if we know its name and format Stroustrup/Programming/2015

A file 0: 1: 2: At the fundamental level, a file is a sequence of bytes numbered from 0 upwards Other notions can be supplied by programs that interpret a “file format” For example, the 6 bytes "123.45" might be interpreted as the floating-point number 123.45 Stroustrup/Programming/2015

Files General model disk Main memory I/O system iostreams Objects (of various types) Files (sequences of bytes) Stroustrup/Programming/2015

Files To read a file To write a file We must know its name (and assign a variable with the name) We must open it (for reading) Then we can read Then we must close it That is typically done implicitly (but a good practice is to close it) To write a file We must name it We must open it (for writing) Or create a new file of that name Then we can write it We must close it That is typically done implicitly Stroustrup/Programming/2015

Opening a file for reading // … int main() { cout << "Please enter input file name: "; // goes to default o/p device: terminal string iname; // this a variable, not the file-name cin >> iname; // read file name from default i/p device: terminal ifstream ist {iname}; // ifstream is an“input stream from a file” // defining an ifstream with a name string // opens the file of that name for reading // now we attach file name: Initialize ist that is std::ifstream class if (!ist) error("can’t open input file ", iname); Stroustrup/Programming/2015

Opening a file for writing // … cout << "Please enter name of output file: "; string oname; cin >> oname; ofstream ofs {oname}; // ofstream is an “output stream from a file” // defining an ofstream with a name string // opens the file with that name for writing if (!ofs) error("can’t open output file ", oname); } Stroustrup/Programming/2015

#include "std_lib_facilities #include "std_lib_facilities.h" struct Reading {                                             int hour;                                            double temperature;              }; int main() {           cout << "Please enter input file name: ";           string iname;           cin >> iname;           ifstream ist {iname};                          if (!ist) error("can't open input file ",iname);           string oname;           cout << "Please enter name of output file: ";           cin >> oname;           ofstream ost {oname};                   if (!ost) error("can't open output file ",oname);    }

………..………… vector<Reading> temps;      // store the readings here           int hour;           double temperature;           while (ist >> hour >> temperature) {                     if (hour < 0 || 23 <hour) error("hour out of range");                     temps.push_back(Reading{hour,temperature});           }           for (int i=0; i<temps.size(); ++i)                     ost << '(' << temps[i].hour << ','                               << temps[i].temperature << ")\n"; ……………

Reading from a file Suppose a file contains a sequence of pairs representing hours and temperature readings 0 60.7 1 60.6 2 60.3 3 59.22 The hours are numbered 0 .. 23 No further format is assumed Maybe we can do better than that (but not just now) Termination Reaching the end-of-file terminates the read Anything unexpected in the file terminates the read E.g., q Stroustrup/Programming/2015

Reading a file struct Reading { // a temperature reading int hour; // hour after midnight [0:23] double temperature; }; vector<Reading> temps; // create a vector to store the readings int hour; while (ist >> hour >> temperature) { // read if (hour < 0 || 23 <hour) error("hour out of range"); // check temps.push_back( Reading{hour,temperature} ); // store } Stroustrup/Programming/2015

I/O error handling Sources of errors Human mistakes Files that fail to meet specifications Specifications that fail to match reality Programmer errors Etc. iostream reduces all errors to one of four states good() // the operation succeeded eof() // we hit the end of input (“end of file”) fail() // something unexpected happened bad() // something unexpected and serious happened Stroustrup/Programming/2015

Sample integer read “failure” Ended by “terminator character” 1 2 3 4 5 * State is fail() Ended by format error 1 2 3 4 5.6 Ended by “end of file” 1 2 3 4 5 end of file 1 2 3 4 5 Control-Z (Windows) 1 2 3 4 5 Control-D (Unix) State is eof() Something really bad Disk format error State is bad() Stroustrup/Programming/2015

int i = 0; cin >> i; if ( int i = 0; cin >> i; if (!cin) {        // we get here (only) if an input operation failed           if (cin.bad()) error("cin is bad");   // stream corrupted: let’s get out of here!           if (cin.eof()) {                     // no more input                     // this is often how we want a sequence of input operations to end           }           if (cin.fail()) {             // stream encountered something unexpected                     cin.clear();      // make ready for more input                     // somehow recover           } }

I/O error handling void fill_vector(istream& ist, vector<int>& v, char terminator) { // read integers from ist into v until we reach eof() or terminator for (int i; ist >> i; ) // read until “some failure” v.push_back(i); // store in v if (ist.eof()) return; // fine: we found the end of file if (ist.bad()) error("ist is bad"); // stream corrupted; let’s get out of here! if (ist.fail()) { // clean up the mess as best we can and report the problem ist.clear(); // clear stream state, so that we can look for terminator char c; ist >> c; // read a character, hopefully terminator if (c != terminator) { // unexpected character ist.unget(); // put that character back ist.clear(ios_base::failbit); // set the state back to fail() } Stroustrup/Programming/2015

Throw an exception for bad() // How to make ist throw if it goes bad: ist.exceptions(ist.exceptions()|ios_base::badbit); // can be read as // “set ist’s exception mask to whatever it was plus badbit” // or as “throw an exception if the stream goes bad” Given that, we can simplify our input loops by no longer checking for bad Stroustrup/Programming/2015

// open an input file: cout << "Please enter input file name\n"; string iname; cin >> iname; ifstream ist {iname}; if (!ifs) error("can't open input file", iname); ifs.exceptions(ifs.exceptions()|ios_base::badbit);       // throw for bad() // open an output file: cout << "Please enter output file name\n"; string oname; cin >> oname; ofstream ost {oname}; if (!ofs) error("can't open output file",oname); // read an arbitrary number of years: vector<Year> ys; while(true) {           Year y;                  // get a freshly initialized Year each time around           if (!(ifs>>y)) break; // reading within if-check           ys.push_back(y); } cout << "read " << ys.size() << " years of readings\n"; for (Year& y : ys) print_year(ofs,y);

Simplified input loop void fill_vector(istream& ist, vector<int>& v, char terminator) { // read integers from ist into v until we reach eof() or terminator for (int i; ist >> i; ) v.push_back(i); if (ist.eof()) return; // fine: we found the end of file // not good() and not bad() and not eof(), ist must be fail() ist.clear(); // clear stream state char c; ist >> c; // read a character, hopefully terminator if (c != terminator) { // ouch: not the terminator, so we must fail ist.unget(); // maybe my caller can use that character ist.clear(ios_base::failbit); // set the state back to fail() } Stroustrup/Programming/2015

Reading a single value Three kinds of problems are possible // first simple and flawed attempt: cout << "Please enter an integer in the range 1 to 10 (inclusive):\n"; int n = 0; while (cin>>n) { // read if (1<=n && n<=10) break; // check range, yeh, what if input ‘t’? cout << "Sorry, " << n << " is not in the [1:10] range; please try again\n"; } // use n here Three kinds of problems are possible the user types an out-of-range value getting no value (end of file) the user types something of the wrong type (here, not an integer) Stroustrup/Programming/2015

Reading a single value What do we want to do in those three cases? handle the problem in the code doing the read? throw an exception to let someone else handle the problem (potentially terminating the program)? ignore the problem? Reading a single value Is something we often do many times We want a solution that’s very simple to use Stroustrup/Programming/2015

Handle everything: What a mess! cout << "Please enter an integer in the range 1 to 10 (inclusive):\n"; int n = 0; while (cin >> n) { if (cin) { // we got an integer; now check it: if (1<=n && n<=10) break; cout << "Sorry, " << n << " is not in the [1:10] range; please try again\n"; } else if (cin.fail()) { // we found something that wasn’t an integer cin.clear(); // we’d like to look at the characters cout << "Sorry, that was not a number; please try again\n"; for (char ch; cin>>ch && !isdigit(ch); ); // throw away non-digits /* do nothing */ ; if (!cin) error("no input"); // we didn’t find a digit: give up cin.unget(); // put the digit back, so that we can read the number else error("no input"); // eof or bad: give up // if we get here n is in [1:10] Stroustrup/Programming/2015

The mess: trying to do everything at once Problem: We have all mixed together reading values prompting the user for input writing error messages skipping past “bad” input characters testing the input against a range Solution: Split it up into logically separate parts Stroustrup/Programming/2015

What do we want? What logical parts do we what? int get_int(int low, int high); // read an int in [low..high] from cin int get_int(); // read an int from cin // so that we can check the range int void skip_to_int(); // we found some “garbage” character // so skip until we find an int Separate functions that do the logically separate actions Stroustrup/Programming/2015

Skip “garbage” void skip_to_int() { if (cin.fail()) { // we found something that wasn’t an integer cin.clear(); // we’d like to look at the characters for(char ch; cin>>ch; ) { // throw away non-digits if (isdigit(ch) || ch=='-') { cin.unget(); // put the digit back, // so that we can read the number return; } error("no input"); // eof or bad: give up Stroustrup/Programming/2015

Get (any) integer int get_int() { int n = 0; while (true) { if (cin >> n) return n; cout << "Sorry, that was not a number; please try again\n"; skip_to_int(); } Stroustrup/Programming/2015

Get integer in range int get_int(int low, int high) { cout << "Please enter an integer in the range " << low << " to " << high << " (inclusive):\n"; while (true) { int n = get_int(); if (low<=n && n<=high) return n; cout << "Sorry, " << n << " is not in the [" << low << ':' << high << "] range; please try again\n"; } Stroustrup/Programming/2015

Use Problem: The “dialog” is built into the read operations int n = get_int(1,10); cout << "n: " << n << endl; int m = get_int(2,300); cout << "m: " << m << endl; Problem: The “dialog” is built into the read operations Stroustrup/Programming/2015

What do we really want? int strength = get_int(1, 10, // parameterize by integer range and “dialog” int strength = get_int(1, 10, "enter strength", "Not in range, try again"); cout << "strength: " << strength << endl; int altitude = get_int(0, 50000, "please enter altitude in feet", "Not in range, please try again"); cout << "altitude: " << altitude << "ft. above sea level\n"; That’s often the really important question Ask it repeatedly during software development As you learn more about a problem and its solution, your answers improve Stroustrup/Programming/2015

Parameterize Incomplete parameterization: get_int() still “blabbers” int get_int(int low, int high, const string& greeting, const string& sorry) { cout << greeting << ": [" << low << ':' << high << "]\n"; while (true) { int n = get_int(); if (low<=n && n<=high) return n; cout << sorry << ": [" << low << ':' << high << "]\n"; } Incomplete parameterization: get_int() still “blabbers” “utility functions” should not produce their own error messages Serious library functions do not produce error messages at all They throw exceptions (possibly containing an error message) Stroustrup/Programming/2015

User-defined output: operator<<() Usually trivial ostream& operator<<(ostream& os, const Date& d) { return os << '(' << d.year() << ',' << d.month() << ',' << d.day() << ')'; } We often use several different ways of outputting a value Tastes for output layout and detail vary Stroustrup/Programming/2015

Use void do_some_printing(Date d1, Date d2) { cout << d1; // means operator<<(cout,d1) ; cout << d1 << d2; // means (cout << d1) << d2; // means (operator<<(cout,d1)) << d2; // means operator<<((operator<<(cout,d1)), d2) ; } Stroustrup/Programming/2015

User-defined input: operator>>() istream& operator>>(istream& is, Date& dd) // Read date in format: ( year , month , day ) { int y, d, m; char ch1, ch2, ch3, ch4; is >> ch1 >> y >> ch2 >> m >> ch3 >> d >> ch4; if (!is) return is; // we didn’t get our values, so just leave if (ch1!='(' || ch2!=',' || ch3!=',' || ch4!=')') { // oops: format error is.clear(ios_base::failbit); // something wrong: set state to fail() return is; // and leave } dd = Date{y,Month(m),d}; // update dd return is; // and leave with is in the good() state Stroustrup/Programming/2015

Strange input format: { year 1990 } {year 1991 { month jun }} { year 1992 { month jan ( 1 0 61.5) }  {month feb (1 1 64) (2 2 65.2) } } {year 2000           { month feb (1 1 68 ) (2 3 66.66 ) ( 1 0 67.2)}           {month dec (15 15 –9.2 ) (15 14 –8.8) (14 0 –2) } }

Review When dealing with input and output, how is the variety of devices dealt with in most modern computers? 2. What, fundamentally, does an istream do? 3. What, fundamentally, does an ostream do? 4. What, fundamentally, is a file? 5. What is a file format? 6. Name four different types of devices that can require I/O for a program. 7. What are the four steps for reading a file? 8. What are the four steps for writing a file? 9. Name and define the four stream states. 10. Discuss how the following input problems can be resolved: a. The user typing an out-of-range value b. Getting no value (end of file) c. The user typing something of the wrong type 11. In what way is input usually harder than output? 12. In what way is output usually harder than input? 13. Why do we (often) want to separate input and output from computation? 14. What are the two most common uses of the istream member function clear()? 15. What are the usual function declarations for << and >> for a user-defined type X? bad() buffer clear() close() device driver eof() fail() file good() ifstream input device input operator iostream istream ofstream open() ostream ouput device ouput operator stream state structured file terminator unget()

Customizing input and output (chapter 11) Next Lecture Customizing input and output (chapter 11) Stroustrup/Programming/2015