1 Chapter 4 Program Input and the Software Design Process
No I/O is built into C++ l instead, a library provides input stream and output stream KeyboardScreen executing program istreamostream 2
is header file l for a library that defines 3 objects an istream object named cin (keyboard) an ostream object named cout (screen) an ostream object named cerr (screen) 3
4 Giving a Value to a Variable In your program you can assign (give) a value to the variable by using the assignment operator = ageOfDog = 12; or by another method, such as cout << “How old is your dog?”; cin >> ageOfDog;
>> is a binary operator >> is called the input or extraction operator >> is left associative EXPRESSIONHAS VALUE cin >> age cin STATEMENT cin >> age >> weight ; 5
Extraction Operator ( >> ) l variable cin is predefined to denote an input stream from the standard input device ( the keyboard ) l the extraction operator >> called “get from” takes 2 operands. The left operand is a stream expression, such as cin--the right operand is a variable of simple type. l operator >> attempts to extract the next item from the input stream and store its value in the right operand variable 6
SYNTAX These examples yield the same result. cin >> length ; cin >> width ; cin >> length >> width ; Input Statements cin >> Variable >> Variable... ; 7
Whitespace Characters Include... l blanks l tabs l end-of-line (newline) characters The newline character is created by hitting Enter or Return at the keyboard, or by using the manipulator endl or “\n” in a program. 8
Extraction Operator >> “skips over” (actually reads but does not store anywhere) leading white space characters as it reads your data from the input stream (either keyboard or disk file) 9
char first ; char middle ; char last ; cin >> first ; cin >> middle ; cin >> last ; NOTE: Or you could have typed: A[Enter]B[enter]C[enter] If you type: ABC DEF GHI only A,B,C are saved firstmiddlelast At keyboard you type: A [ space]B [ space ] C [ Enter] firstmiddlelast ‘A’‘B’‘C’ 10
At keyboard you type: [ space ] 25 [ space ] J [ space]2 [ Enter ] int age ; char initial ; float bill ; cin >> age ; cin >> initial ; cin >> bill ; NOTE: If illegal input (characters for int or float), the results are unpredictable ageinitialbill ageinitialbill 25‘J’2.0 11
Keyboard and Screen I/O #include cin (of type istream) cout (of type ostream) KeyboardScreen executing program input data output data 12
STATEMENTS CONTENTS MARKER POSITION int i ; 25 A\n char ch ; 16.9\n float x ; cin >> i ; 25 A\n 16.9\n cin >> ch ; 25 A\n 16.9\n cin >> x ; 25 A\n 16.9\n Another example using >> ichx 25 ‘A’ ichx i x i x ‘A’ NOTE: shows the location of the file reading marker 13
14 The get( ) function can be used to read a single character. It obtains the very next character from the input stream without skipping any leading whitespace characters. Another Way to Read char Data
char first ; char middle ; char last ; cin.get ( first ) ; cin.get ( middle ) ; cin.get ( last ) ; NOTE: The file reading marker is left pointing to the space after the ‘B’ in the input stream. firstmiddlelast At keyboard you type: A [ space]B [ space ] C [ Enter] firstmiddlelast ‘A’‘ ’‘B’ 15
16 Use function ignore( ) to skip characters The ignore( ) function is used to skip (read and discard) characters in the input stream. The call cin.ignore ( howMany, whatChar ) ; will skip over up to howMany characters or until whatChar has been read, whichever comes first.
An Example Using cin.ignore( ) abc abc abc abc NOTE: shows the location of the file reading marker STATEMENTS CONTENTS MARKER POSITION int a ; \n int b ; \n int c ; cin >> a >> b ; \n \n cin.ignore(100, ‘\n’) ; \n \n cin >> c ; \n \n 17
Another Example Using cin.ignore( ) ich ich i i 16‘A’ NOTE: shows the location of the file reading marker STATEMENTS CONTENTS MARKER POSITION int i ; A 22 B 16 C 19\n char ch ; cin >> ch ; A 22 B 16 C 19\n cin.ignore(100, ‘B’) ; A 22 B 16 C 19\n cin >> i ; A 22 B 16 C 19\n 18
19 EXAMPLE string message ; cin >> message ; cout << message ; HOWEVER... String Input in C++ Input of a string is possible using the extraction operator >>.
20 Extraction operator >> When using the extraction operator ( >> ) to read input characters into a string variable: l the >> operator skips any leading whitespace characters such as blanks and newlines l it then reads successive characters into the string, and stops at the first trailing whitespace character (which is not consumed, but remains waiting in the input stream)
21 String Input Using >> string firstName ; string lastName ; cin >> firstName >> lastName ; Suppose input stream looks like this: Joe Hernandez 23 WHAT ARE THE STRING VALUES?
22 Results Using >> string firstName ; string lastName ; cin >> firstName >> lastName ; RESULT “J o e” “Hernandez” firstName lastName
23 getline( ) Function l Because the extraction operator stops reading at the first trailing whitespace, >> cannot be used to input a string with blanks in it l use getline function with 2 arguments to overcome this obstacle l First argument is an input stream variable, and second argument is a string variable EXAMPLE string message ; getline (cin, message ) ;
24 getline(inFileStream, str) l getline does not skip leading whitespace characters such as blanks and newlines l getline reads successive characters (including blanks) into the string, and stops when it reaches the newline character ‘\n’ l the newline is consumed by get, but is not stored into the string variable
25 String Input Using getline string firstName ; string lastName ; getline (cin, firstName ); getline (cin, lastName ); Suppose input stream looks like this: Joe Hernandez 23 WHAT ARE THE STRING VALUES?
26 Results Using getline “ Joe Hernandez 23” ? firstName lastName string firstName ; string lastName ; getline (cin, firstName ); getline (cin, lastName );
Interactive I/O l in an interactive program the user enters information while the program is executing l before the user enters data, a prompt should be provided to explain what type of information should be entered l after the user enters data, the value of the data should be printed out for verification. This is called echo printing l that way, the user will have the opportunity to check for erroneous data 27
Prompting for Interactive I/O cout << “Enter part number : “ << endl ; // prompt cin >> partNumber ; cout << “Enter quantity ordered : “ << endl ; cin >> quantity ; cout << “Enter unit price : “ << endl ; cin >> unitPrice ; totalPrice = quantity * unitPrice ; // calculate cout << “Part # “ << partNumber << endl ; // echo cout << “Quantity: “ << quantity << endl ; cout << “Unit Cost: $ “ << setprecision(2) << unitPrice << endl ; cout << “Total Cost: $ “ << totalPrice << endl ; 28
Disk Files for I/O your variable (of type ifstream) your variable (of type ofstream) disk file “C:\myInfile.dat” disk file “C:\myOut.dat” executing program input dataoutput data #include 29
To Use Disk I/O, you must l use #include l choose valid identifiers (file handles) for your filestreams and declare them l open the files and associate them with disk names l use your filestream identifiers (file handles) in your I/O statements (using >> and <<, manipulators, get, ignore) l close the files 30
31 File Names l Complete file names are composed of: n A drive letter followed by a colon n A path specification of directories (also called folders by windows) separated by backslashes (\) n Then the file name
32 File Name Examples l File prog1.cpp in the prog1 directory in the CS115 directory on the C drive: C:\CS115\prog1\prog1.cpp
33 Files for your project l You do not have to use complete file names l To open a file on your project directory just use its name: myfile.txt l You only have to use complete file names for files not in your project directory (for example, a flashdrive)
34 Statements for File I/O l Include fstream library l Open the file for reading or writing: n Use file name n Associate with file handle l Read/write the file using file handle l Close the file
Statements for Using Disk I/O #include // For file I/O ifstream inFile; // File handle for reading ofstream outFile; // File handle for writing inFile.open(“walk.txt”); // open file (read) outFile.open(“results.txt”);//open file (write) inFile >> variables; // Read into variables outFile << variables; // Write from variables infile.close( ); // close files outfile.close( ); 35
36 Opening a File On your project directory: inFile.open(“walk.txt”); On the flash drive: inFile.open(“F:\\walk.txt”); (assuming that F is the drive letter) In the temp directory on the C drive: inFile.open(“C:\\temp\\walk.txt”);
37 Why \\ and not \ in File Names l In character strings the backslash has a special meaning and is called the escape character l Use of the escape character means “The next character has a special meaning”
38 Use of the Escape Character l To insert a tab character: cout <<“\tThis is indented text”<<endl; l To end a line (go to next line): cout<<“Start new line\n”; l Use of \n is the same as endl l To use a backslash as a character: cout <<“Backslash:\\”;
What does opening a file do? l associates the C++ identifier (file handle) for your file with the physical (disk) name for the file l if the input file does not exist on disk, open is not successful l if the output file does not exist on disk, a new file with that name is created l if the output file already exists, it is erased l places a file reading marker at the very beginning of the file, pointing to the first character in it 39
40 Map Measurement Case Study You want a program to determine walking distances between 4 sights in the city. Your city map legend says one inch on the map equals 1/4 mile in the city. Read from a file the 4 measured distances between sights on the map and the map scale. Output to a file the rounded (to the nearest tenth) walking distances between the 4 sights.
41 // *************************************************** // Walk program using file I/O // This program computes the mileage (rounded to nearest // tenth of mile) for each of 4 distances, using input // map measurements and map scale. // *************************************************** #include // for cout, endl #include // for setprecision #include // for file I/O using namespace std; float RoundToNearestTenth( float ); // declare function Using File I/O
42 int main( ) { float distance1; // First map distance float distance2; // Second map distance float distance3; // Third map distance float distance4; // Fourth map distance float scale; // Map scale (miles/inch) float totMiles; // Total of rounded miles float miles;// One rounded mileage ifstream inFile; // Input file identifier ofstream outFile; // Output file identifier inFile.open(“walk.txt”); // on project directory // inFile.open(“F:\\walk.txt”); // on flashdrive // inFile.open(“C:\\temp\\walk.txt”); // in temp dir. on C outFile.open(“results.txt”);
43 // Get data from file inFile >> distance1 >> distance2 >> distance3 >> distance4 >> scale; totMiles = 0.0;// Initialize total miles // Compute miles for each distance on map miles = RoundToNearestTenth( distance1 * scale ); outFile << distance1 << “ inches on map is “ << miles << “ miles in city.” << endl; totMiles = totMiles + miles;
44 miles = RoundToNearestTenth( distance2 * scale ); outFile << distance2 << “ inches on map is “ << miles << “ miles in city.” << endl; totMiles = totMiles + miles; miles = RoundToNearestTenth( distance3 * scale ); outFile << distance3 << “ inches on map is “ << miles << “ miles in city.” << endl; totMiles = totMiles + miles; miles = RoundToNearestTenth( distance4 * scale ); outFile << distance4 << “ inches on map is “ << miles << “ miles in city.” << endl; totMiles = totMiles + miles;
45 // Write total miles to output file outFile << endl << “Total walking mileage is “ << totMiles << “ miles.” << endl; return 0 ;// Successful completion } // *************************************************** float RoundToNearestTenth ( /* in */ float floatValue) // Function returns floatValue rounded to nearest tenth. { return float(int(floatValue * )) / 10.0; }
Stream Fail State l when a stream enters the fail state, further I/O operations using that stream have no effect at all. But the computer does not automatically halt the program or give any error message l possible reasons for entering fail state include: invalid input data (often the wrong type) opening an input file that doesn’t exist opening an output file on a flashdrive that is already full 46
Entering File Name at Run Time #include // contains conversion function c_str ifstream inFile; string fileName; cout << “Enter input file name : “ << endl ; // prompt cin >> fileName ; // convert string fileName to a C string type inFile.open( fileName.c_str( ) ); 47
48 C Strings l C strings are the original (harder to use) way of using character strings l They have been replaced by strings (much easier to use) l However there are built-in functions (such as open) that require C strings l Remember that the parameter types you pass to a function must match what it expects
49 C Strings l C strings are used in other CS l For now use strings l For the built-in functions that require C strings convert them by: stringVariableName.c_str() This returns the C string equivalent of the string variable
50 The String Class l Strings are really a class l You create objects of the class: string filename; l You perform operations (call functions) on the object: filename.c_str() l The format is: object_name.function l More in other CS courses