500 likes | 611 Views
Chapter 4 Program Input and the Software Design Process. Keyboard. Screen. executing program. No I/O is built into C++. instead, a library provides input stream and output stream. istream. ostream. 2. <iostream> is header file. for a library that defines 3 objects
E N D
Keyboard Screen executing program No I/O is built into C++ • instead, a library provides input stream and output stream istream ostream 2
<iostream> is header file • 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
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 EXPRESSION HAS VALUE cin >> age cin STATEMENT cin >> age >> weight ; 5
Extraction Operator ( >> ) • variable cin is predefined to denote an input stream from the standard input device( the keyboard ) • 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. • operator >> attempts to extract the next item from the input stream and store its value in the right operand variable 6
Input Statements SYNTAX These examples yield the same result. cin >> length ; cin >> width ; cin >> length >> width ; cin >> Variable >> Variable .. . ; 7
Whitespace Characters Include . . . • blanks • tabs • 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 At keyboard you type:A[space]B[space]C[Enter] first middle last ‘A’ ‘B’ ‘C’ first middle last 10
age initial bill age initial bill 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 At keyboard you type:[space]25[space]J[space]2[Enter] 25 ‘J’ 2.0 11
output data input data executing program Keyboard Screen cin (of type istream) cout (of type ostream) Keyboard and Screen I/O #include <iostream> 12
NOTE: shows the location of the file reading marker i ch x i ch x 25 ‘A’ i ch x 25 ‘A’ i ch x STATEMENTS CONTENTS MARKER POSITION int i ; 25 A\n char ch ; 16.9\n float x ; cin >> i ; 25A\n 16.9\n cin >> ch ; 25 A\n 16.9\n cin >> x ; 25 A\n 16.9\n Another example using >> 25 16.9 13
Another Way to Read char Data 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 whitespacecharacters.
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. At keyboard you type:A[space]B[space]C[Enter] first middle last ‘A’ ‘ ’ ‘B’ first middle last 15
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.
NOTE: shows the location of the file reading marker a b c 957 34 a b c 957 34 a b c 957 34 128 a b c STATEMENTS CONTENTS MARKER POSITION int a ; 957 34 1235\n int b ; 128 96\n int c ; cin >> a >> b ; 957 34 1235\n 128 96\n cin.ignore(100, ‘\n’) ; 957 34 1235\n 128 96\n cin >> c ; 957 34 1235\n 128 96\n An Example Using cin.ignore( ) 17
NOTE: shows the location of the file reading marker 957 34 ‘A’ 957 34 ‘A’ 957 16 34 ‘A’ 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 Another Example Using cin.ignore( ) i ch i ch i ch i ch 18
String Input in C++ Input of a string is possible using the extraction operator >>. EXAMPLE string message ; cin >> message ; cout << message ; HOWEVER . . .
Extraction operator >> When using the extraction operator ( >> ) to read input characters into a string variable: • the >> operator skips any leading whitespace characters such as blanks and newlines • 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)
String Input Using >> string firstName ; string lastName ; cin >> firstName >> lastName ; Suppose input stream looks like this: JoeHernandez 23 WHAT ARE THE STRING VALUES?
Results Using >> string firstName ; string lastName ; cin >> firstName >> lastName ; RESULT “J o e” “Hernandez” firstName lastName
getline( ) Function • Because the extraction operator stops reading at the first trailing whitespace, >>cannot be used to input a string with blanks in it • use getline function with 2 arguments to overcome this obstacle • First argument is an input stream variable, and second argument is a string variable EXAMPLE string message ; getline (cin, message ) ;
getline(inFileStream, str) • getline does notskip leading whitespace characters such as blanks and newlines • getline reads successive characters (including blanks) into the string, and stops when it reaches the newline character ‘\n’ • the newline is consumed by get, but is not stored into the string variable
String Input Using getline string firstName ; string lastName ; getline (cin, firstName ); getline (cin, lastName ); Suppose input stream looks like this: JoeHernandez 23 WHAT ARE THE STRING VALUES?
Results Using getline string firstName ; string lastName ; getline (cin, firstName ); getline (cin, lastName ); “ JoeHernandez 23” ? firstName lastName
Interactive I/O • in an interactive program the user enters information while the program is executing • before the user enters data, a prompt should be provided to explain what type of information should be entered • after the user enters data, the value of the data should be printed out for verification. This is called echo printing • 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
input data output data disk file “C:\myInfile.dat” disk file “C:\myOut.dat” executing program your variable (of type ifstream) your variable (of type ofstream) Disk Files for I/O #include <fstream> 29
To Use Disk I/O, you must • use #include <fstream> • choose valid identifiers (file handles) for your filestreams and declare them • open the files and associate them with disk names • use your filestream identifiers (file handles) in your I/O statements (using >> and << , manipulators, get, ignore) • close the files 30
File Names • Complete file names are composed of: • A drive letter followed by a colon • A path specification of directories (also called folders by windows) separated by backslashes (\) • Then the file name
File Name Examples • File prog1.cpp in the prog1 directory in the CS115 directory on the C drive: C:\CS115\prog1\prog1.cpp
Files for your project • You do not have to use complete file names • To open a file on your project directory just use its name: myfile.txt • You only have to use complete file names for files not in your project directory (for example, a flashdrive)
Statements for File I/O • Include fstream library • Open the file for reading or writing: • Use file name • Associate with file handle • Read/write the file using file handle • Close the file
Statements for Using Disk I/O #include <fstream> // 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
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”);
Why \\ and not \ in File Names • In character strings the backslash has a special meaning and is called the escape character • Use of the escape character means “The next character has a special meaning”
Use of the Escape Character • To insert a tab character: cout <<“\tThis is indented text”<<endl; • To end a line (go to next line): cout<<“Start new line\n”; • Use of \n is the same as endl • To use a backslash as a character: cout <<“Backslash:\\”;
What does opening a file do? • associates the C++ identifier (file handle) for your file with the physical (disk) name for the file • if the input file does not exist on disk, open is not successful • if the output file does not exist on disk, a new file with that name is created • if the output file already exists, it is erased • places a file reading marker at the very beginning of the file, pointing to the first character in it 39
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.
Using File I/O // *************************************************** // 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 <iostream> // for cout, endl #include <iomanip> // for setprecision #include <fstream> // for file I/O using namespace std; float RoundToNearestTenth( float ); // declare function
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”);
// 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;
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;
// 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 + 0.5)) / 10.0; }
Stream Fail State • 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 • 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 <string> // 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
C Strings • C strings are the original (harder to use) way of using character strings • They have been replaced by strings (much easier to use) • However there are built-in functions (such as open) that require C strings • Remember that the parameter types you pass to a function must match what it expects
C Strings • C strings are used in other CS • For now use strings • 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
The String Class • Strings are really a class • You create objects of the class: string filename; • You perform operations (call functions) on the object: filename.c_str() • The format is: object_name.function • More in other CS courses