You are on page 1of 215

Chapter 9:

Pointers

Copyright 2012 Pearson Education, Inc.

9.1
Getting the Address of a Variable

Copyright 2012 Pearson Education, Inc.

Getting the Address of a Variable


Each variable in program is stored at a unique address Use address operator & to get address of a variable:
int num = -99; cout << &num; // prints address // in hexadecimal

Copyright 2012 Pearson Education, Inc.

9.2
Pointer Variables

Copyright 2012 Pearson Education, Inc.

Pointer Variables
Pointer variable : Often just called a pointer, it's a variable that holds an address
Because a pointer variable holds the address of another piece of data, it "points" to the data

Copyright 2012 Pearson Education, Inc.

Something Like Pointers: Arrays


We have already worked with something similar to pointers, when we learned to pass arrays as arguments to functions. For example, suppose we use this statement to pass the array numbers to the showValues function:

showValues(numbers, SIZE);

Copyright 2012 Pearson Education, Inc.

Something Like Pointers : Arrays


The values parameter, in the showValues function, points to the numbers array.

C++ automatically stores the address of numbers in the values parameter.

Copyright 2012 Pearson Education, Inc.

Something Like Pointers: Reference Variables


We have also worked with something like pointers when we learned to use reference variables. Suppose we have this function:
void getOrder(int &donuts) { cout << "How many doughnuts do you want? "; cin >> donuts; }

And we call it with this code:


int jellyDonuts; getOrder(jellyDonuts);

Copyright 2012 Pearson Education, Inc.

Something Like Pointers: Reference Variables


The donuts parameter, in the getOrder function, points to the jellyDonuts variable.

C++ automatically stores the address of jellyDonuts in the donuts parameter.

Copyright 2012 Pearson Education, Inc.

Pointer Variables
Pointer variables are yet another way using a memory address to work with a piece of data. Pointers are more "low-level" than arrays and reference variables. This means you are responsible for finding the address you want to store in the pointer and correctly using it.

Copyright 2012 Pearson Education, Inc.

Pointer Variables
Definition:
int *intptr;

Read as: intptr can hold the address of an int Spacing in definition does not matter:
int * intptr; int* intptr; // same as above // same as above

Copyright 2012 Pearson Education, Inc.

Pointer Variables
Assigning an address to a pointer variable:
int *intptr; intptr = &num;

Memory layout:
num
25 address of num: 0x4a00

intptr

0x4a00

Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

The Indirection Operator


The indirection operator (*) dereferences a pointer. It allows you to access the item that the pointer points to. int x = 25; int *intptr = &x; cout << *intptr << endl;
This prints 25.
Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

9-16
Copyright 2012 Pearson Education, Inc.

9.3
The Relationship Between Arrays and Pointers

Copyright 2012 Pearson Education, Inc.

The Relationship Between Arrays and Pointers


Array name is starting address of array
int vals[] = {4, 7, 11}; 4
starting address of vals: 0x4a00

11

cout << vals;

cout << vals[0];

// displays // 0x4a00 // displays 4

Copyright 2012 Pearson Education, Inc.

The Relationship Between Arrays and Pointers


Array name can be used as a pointer constant:
int vals[] = {4, 7, 11}; cout << *vals; // displays 4

Pointer can be used as an array name:


int *valptr = vals; cout << valptr[1]; // displays 7

Copyright 2012 Pearson Education, Inc.

9-20
Copyright 2012 Pearson Education, Inc.

Pointers in Expressions
Given:
int vals[]={4,7,11}, *valptr; valptr = vals;

What is valptr + 1? It means (address in valptr) + (1 * size of an int)


cout << *(valptr+1); //displays 7 cout << *(valptr+2); //displays 11

Must use ( ) as shown in the expressions


Copyright 2012 Pearson Education, Inc.

Array Access
Array elements can be accessed in many ways:
Array access method array name and [] pointer to array and [] Example vals[2] = 17; valptr[2] = 17;

array name and subscript arithmetic


pointer to array and subscript arithmetic

*(vals + 2) = 17;
*(valptr + 2) = 17;

Copyright 2012 Pearson Education, Inc.

Array Access
Conversion: vals[i] is equivalent to *(vals + i)

No bounds checking performed on array access, whether using array name or a pointer

Copyright 2012 Pearson Education, Inc.

From Program 9-7

Copyright 2012 Pearson Education, Inc.

9.4
Pointer Arithmetic

Copyright 2012 Pearson Education, Inc.

Pointer Arithmetic
Operations on pointer variables:
Operation Example
int vals[]={4,7,11}; int *valptr = vals; valptr++; // points at 7 valptr--; // now points at 4

++, --

+, - (pointer and int)


+=, -= (pointer and int) - (pointer from pointer)

cout << *(valptr + 2); // 11


valptr = vals; // points at 4 valptr += 2; // points at 11 cout << valptrval; // difference //(number of ints) between valptr // and val
9-26

Copyright 2012 Pearson Education, Inc.

From Program 9-9

Copyright 2012 Pearson Education, Inc.

9.5
Initializing Pointers

Copyright 2012 Pearson Education, Inc.

Initializing Pointers
Can initialize at definition time:
int num, *numptr = &num; int val[3], *valptr = val;

Cannot mix data types:


double cost; int *ptr = &cost; // wont work

Can test for an invalid address for ptr with:


if (!ptr) ...

Copyright 2012 Pearson Education, Inc.

9.6
Comparing Pointers

Copyright 2012 Pearson Education, Inc.

Comparing Pointers
Relational operators (<, >=, etc.) can be used to compare addresses in pointers Comparing addresses in pointers is not the same as comparing contents pointed at by pointers:
if (ptr1 == ptr2) // // if (*ptr1 == *ptr2) // // compares addresses compares contents
9-31
Copyright 2012 Pearson Education, Inc.

9.7
Pointers as Function Parameters

Copyright 2012 Pearson Education, Inc.

Pointers as Function Parameters


A pointer can be a parameter Works like reference variable to allow change to argument from within function Requires:
1)
2) 3)

asterisk * on parameter in prototype and heading


asterisk * in body to dereference the pointer address as argument to the function
// pass address of num to getNum

void getNum(int *ptr); // ptr is pointer to an int

cin >> *ptr;


getNum(&num);

Copyright 2012 Pearson Education, Inc.

Example
void swap(int *x, int *y) { int temp; temp = *x; *x = *y; *y = temp; } int num1 = 2, num2 = -3; swap(&num1, &num2);

Copyright 2012 Pearson Education, Inc.

(Program Continues)
Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

Pointers to Constants
If we want to store the address of a constant in a pointer, then we need to store it in a pointer-to-const.

Copyright 2012 Pearson Education, Inc.

Pointers to Constants
Example: Suppose we have the following definitions:
const int SIZE = 6; const double payRates[SIZE] = { 18.55, 17.45, 12.85, 14.97, 10.35, 18.89 };

In this code, payRates is an array of constant doubles.


9-38
Copyright 2012 Pearson Education, Inc.

Pointers to Constants
Suppose we wish to pass the payRates array to a function? Here's an example of how we can do it.
void displayPayRates(const double *rates, int size) { for (int count = 0; count < size; count++) { cout << "Pay rate for employee " << (count + 1) << " is $" << *(rates + count) << endl; } }
The parameter, rates, is a pointer to const double.
Copyright 2012 Pearson Education, Inc.

Declaration of a Pointer to Constant

Copyright 2012 Pearson Education, Inc.

Constant Pointers
A constant pointer is a pointer that is initialized with an address, and cannot point to anything else. Example int value = 22; int * const ptr = &value;
Copyright 2012 Pearson Education, Inc.

Constant Pointers

Copyright 2012 Pearson Education, Inc.

Constant Pointers to Constants


A constant pointer to a constant is:
a pointer that points to a constant a pointer that cannot point to anything except what it is pointing to

Example: int value = 22; const int * const ptr = &value;

Copyright 2012 Pearson Education, Inc.

Constant Pointers to Constants

Copyright 2012 Pearson Education, Inc.

9.8
Dynamic Memory Allocation

Copyright 2012 Pearson Education, Inc.

Dynamic Memory Allocation


Can allocate storage for a variable while program is running Computer returns address of newly allocated variable Uses new operator to allocate memory:
double *dptr; dptr = new double;

new returns address of memory location

Copyright 2012 Pearson Education, Inc.

Dynamic Memory Allocation


Can also use new to allocate array: const int SIZE = 25; arrayPtr = new double[SIZE]; Can then use [] or pointer arithmetic to access array:
for(i = 0; i < SIZE; i++) *arrayptr[i] = i * i; or for(i = 0; i < SIZE; i++) *(arrayptr + i) = i * i;

Program will terminate if not enough memory available to allocate

Copyright 2012 Pearson Education, Inc.

Releasing Dynamic Memory


Use delete to free dynamic memory:
delete fptr;

Use [] to free dynamic array:


delete [] arrayptr;

Only use delete with dynamic memory!

Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

Program 9-14 (Continued)

Copyright 2012 Pearson Education, Inc.

Notice that in line 49 the value 0 is assigned to the sales pointer. It is a good practice to store 0 in a pointer variable after using delete on it. First, it prevents code from inadvertently using the pointer to access the area of memory that was freed. Second, it prevents errors from occurring if delete is accidentally called on the pointer again. The delete operator is designed to have no effect when used on a null pointer.
Copyright 2012 Pearson Education, Inc.

9.9
Returning Pointers from Functions

Copyright 2012 Pearson Education, Inc.

Returning Pointers from Functions


Pointer can be the return type of a function:
int* newNum();

The function must not return a pointer to a local variable in the function. A function should only return a pointer:
to data that was passed to the function as an argument, or to dynamically allocated memory

Copyright 2012 Pearson Education, Inc.

From Program 9-15

Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

Chapter 10:
Characters, CStrings, and More About the string Class

Copyright 2012 Pearson Education, Inc.

10.1
Character Testing

Copyright 2012 Pearson Education, Inc.

Character Testing
require cctype header file
FUNCTION MEANING

isalpha
isalnum isdigit islower isprint ispunct isupper isspace

true if arg. is a letter, false otherwise


true if arg. is a letter or digit, false otherwise true if arg. is a digit 0-9, false otherwise true if arg. is lowercase letter, false otherwise true if arg. is a printable character, false otherwise true if arg. is a punctuation character, false otherwise true if arg. is an uppercase letter, false otherwise true if arg. is a whitespace character, false otherwise

Copyright 2012 Pearson Education, Inc.

From Program 10-1

Copyright 2012 Pearson Education, Inc.

10.2
Character Case Conversion

Copyright 2012 Pearson Education, Inc.

Character Case Conversion


Require cctype header file

Functions:
toupper: if char argument is lowercase letter, return uppercase equivalent; otherwise, return input unchanged char ch1 = 'H'; char ch2 = 'e'; char ch3 = '!'; cout << toupper(ch1); // displays 'H' cout << toupper(ch2); // displays 'E' cout << toupper(ch3); // displays '!'
Copyright 2012 Pearson Education, Inc.

Character Case Conversion


Functions:
tolower: if char argument is uppercase letter, return lowercase equivalent; otherwise, return input unchanged char ch1 = 'H'; char ch2 = 'e'; char ch3 = '!'; cout << tolower(ch1); // displays 'h' cout << tolower(ch2); // displays 'e' cout << tolower(ch3); // displays '!'

Copyright 2012 Pearson Education, Inc.

10.3
C-Strings

Copyright 2012 Pearson Education, Inc.

C-Strings
C-string: sequence of characters stored in adjacent memory locations and terminated by NULL character String literal (string constant): sequence of characters enclosed in double quotes " " : "Hi there!"
H i t h e r e ! \0

Copyright 2012 Pearson Education, Inc.

C-Strings
Array of chars can be used to define storage for string: const int SIZE = 20; char city[SIZE];

Leave room for NULL at end Can enter a value using cin or >>
Input is whitespace-terminated No check to see if enough space

For input containing whitespace, and to control amount of input, use cin.getline()
Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

10.4
Library Functions for Working with C-Strings

Copyright 2012 Pearson Education, Inc.

Library Functions for Working with C-Strings


Require the cstring header file Functions take one or more C-strings as arguments. Can use:
C-string name pointer to C-string literal string

Copyright 2012 Pearson Education, Inc.

Library Functions for Working with C-Strings


Functions:
strlen(str): returns length of C-string str
char city[SIZE] = "Missoula"; cout << strlen(city); // prints 8

strcat(str1, str2): appends str2 to the end of str1


char location[SIZE] = "Missoula, "; char state[3] = "MT"; strcat(location, state); // location now has "Missoula, MT"
Copyright 2012 Pearson Education, Inc.

Library Functions for Working with C-Strings


Functions:
strcpy(str1, str2): copies str2 to str1
const int SIZE = 20; char fname[SIZE] = "Maureen", name[SIZE]; strcpy(name, fname);

Note: strcat and strcpy perform no bounds checking to determine if there is enough space in receiving character array to hold the string it is being assigned.
Copyright 2012 Pearson Education, Inc.

C-string Inside a C-string


Function:
strstr(str1, str2): finds the first occurrence of str2 in str1. Returns a pointer to match, or NULL if no match.
char river[] = "Wabash"; char word[] = "aba"; cout << strstr(state, word); // displays "abash"

Copyright 2012 Pearson Education, Inc.

10.5
C-String/Numeric Conversion Functions

Copyright 2012 Pearson Education, Inc.

String/Numeric Conversion Functions


require cstdlib header file
FUNCTION atoi atol atof itoa PARAMETER C-string C-string C-string int,C-string, int ACTION converts C-string to an int value, returns the value converts C-string to a long value, returns the value converts C-string to a double value, returns the value converts 1st int parameter to a C-string, stores it in 2nd parameter. 3rd parameter is base of converted value

Copyright 2012 Pearson Education, Inc.

String/Numeric Conversion Functions


int iNum; long lNum; double dNum; char intChar[10]; iNum = atoi("1234"); // puts 1234 in iNum lNum = atol("5678"); // puts 5678 in lNum dNum = atof("35.7"); // puts 35.7 in dNum itoa(iNum, intChar, 8); // puts the string // "2322" (base 8 for 123410) in intChar

Copyright 2012 Pearson Education, Inc.

String/Numeric Conversion Functions - Notes


if C-string contains non-digits, results are undefined
function may return result up to non-digit function may return 0

itoa does no bounds checking make sure there is enough space to store the result
Copyright 2012 Pearson Education, Inc.

10.6
Writing Your Own C-String Handling Functions

10.6
Writing Your Own C-String Handling Functions

Copyright 2012 Pearson Education, Inc.

Writing Your Own C-String Handling Functions


Designing C-String Handling Functions
can pass arrays or pointers to char arrays
Can perform bounds checking to ensure enough space for results Can anticipate unexpected user input

Copyright 2012 Pearson Education, Inc.

From Program 10-9

Copyright 2012 Pearson Education, Inc.

From Program 10-10

Copyright 2012 Pearson Education, Inc.

10.7
More About the C++ string Class

Copyright 2012 Pearson Education, Inc.

The C++ string Class


Special data type supports working with strings #include <string> Can define string variables in programs:
string firstName, lastName;

Can receive values with assignment operator:


firstName = "George"; lastName = "Washington";

Can be displayed via cout


cout << firstName << " " << lastName;

Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

Input into a string Object


Use cin >> to read an item into a string:
string firstName; cout << "Enter your first name: "; cin >> firstName;

Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

Input into a string Object


Use getline function to put a line of input, possibly including spaces, into a string:
string address; cout << "Enter your address: "; getline(cin,address);

Copyright 2012 Pearson Education, Inc.

string Comparison
Can use relational operators directly to compare string objects:
string str1 = "George", str2 = "Georgia"; if (str1 < str2) cout << str1 << " is less than " << str2;

Comparison is performed similar to strcmp function. Result is true or false

Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

Other Definitions of C++ strings


Definition
string name; string myname("Chris"); string yourname(myname); string aname(myname, 3); string verb(myname,3,2);

Meaning
defines an empty string object defines a string and initializes it defines a string and initializes it defines a string and initializes it with first 3 characters of myname defines a string and initializes it with 2 characters from myname starting at position 3 defines string and initializes it to 5 'A's

string noname('A', 5);

Copyright 2012 Pearson Education, Inc.

string Operators
OPERATOR >> << = += + [] >, >=, <, <=, ==, != MEANING extracts characters from stream up to whitespace, insert into string inserts string into stream assigns string on right to string object on left appends string on right to end of contents on left concatenates two strings references character in string using array notation relational operators for string comparison. Return true or false

Copyright 2012 Pearson Education, Inc.

string Operators
string word1, phrase; string word2 = " Dog"; cin >> word1; // user enters "Hot Tamale" // word1 has "Hot" phrase = word1 + word2; // phrase has // "Hot Dog" phrase += " on a bun"; for (int i = 0; i < 16; i++) cout << phrase[i]; // displays // "Hot Dog on a bun"

Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

string Member Functions


Are behind many overloaded operators Categories:
assignment: assign, copy, data modification: append, clear, erase, insert, replace, swap space management: capacity, empty, length, resize, size substrings: find, substr comparison: compare

See Table 10-7 for a list of functions

Copyright 2012 Pearson Education, Inc.

string Member Functions


string word1, word2, phrase; cin >> word1; // word1 is "Hot" word2.assign(" Dog"); phrase.append(word1); phrase.append(word2); // phrase has "Hot Dog" phrase.append(" with mustard relish", 13); // phrase has "Hot Dog with mustard" phrase.insert(8, "on a bun "); cout << phrase << endl; // displays // "Hot Dog on a bun with mustard"

Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

Chapter 11:
Structured Data

Copyright 2012 Pearson Education, Inc.

11.1
Abstract Data Types

Copyright 2012 Pearson Education, Inc.

Abstract Data Types


A data type that specifies
values that can be stored operations that can be done on the values

User of an abstract data type does not need to know the implementation of the data type, e.g., how the data is stored ADTs are created by programmers

Copyright 2012 Pearson Education, Inc.

Abstraction and Data Types


Abstraction: a definition that captures general characteristics without details
Ex: An abstract triangle is a 3-sided polygon. A specific triangle may be scalene, isosceles, or equilateral

Data Type defines the values that can be stored in a variable and the operations that can be performed on it

Copyright 2012 Pearson Education, Inc.

11.2
Combining Data into Structures

Copyright 2012 Pearson Education, Inc.

Combining Data into Structures


Structure: C++ construct that allows multiple variables to be grouped together General Format:
struct <structName> { type1 field1; type2 field2; . . . };

Copyright 2012 Pearson Education, Inc.

Example struct Declaration


struct Student { int studentID; string name; short yearInSchool; double gpa; };

structure tag structure members

Copyright 2012 Pearson Education, Inc.

struct Declaration Notes


Must have ; after closing } struct names commonly begin with uppercase letter Multiple fields of same type can be in comma-separated list:
string name, address;

Copyright 2012 Pearson Education, Inc.

Defining Variables
struct declaration does not allocate memory or create variables To define variables, use structure tag as type name:
Student bill;
bill studentID name

yearInSchool gpa

Copyright 2012 Pearson Education, Inc.

11.3
Accessing Structure Members

Copyright 2012 Pearson Education, Inc.

Accessing Structure Members


Use the dot (.) operator to refer to members of struct variables:
cin >> stu1.studentID; getline(cin, stu1.name); stu1.gpa = 3.75;

Member variables can be used in any manner appropriate for their data type

11-107
Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

Displaying a struct Variable


To display the contents of a struct variable, must display each field separately, using the dot operator:
cout cout cout cout cout << << << << << bill; // wont work bill.studentID << endl; bill.name << endl; bill.yearInSchool; " " << bill.gpa;

Copyright 2012 Pearson Education, Inc.

Comparing struct Variables


Cannot compare struct variables directly:
if (bill == william) // wont work

Instead, must compare on a field basis:


if (bill.studentID == william.studentID) ...

Copyright 2012 Pearson Education, Inc.

11.4
Initializing a Structure

Copyright 2012 Pearson Education, Inc.

Initializing a Structure
struct variable can be initialized when defined:
Student s = {11465, "Joan", 2, 3.75};

Can also be initialized member-bymember after definition:


s.name = "Joan"; s.gpa = 3.75;

Copyright 2012 Pearson Education, Inc.

More on Initializing a Structure


May initialize only some members:
Student bill = {14579};

Cannot skip over members:


Student s = {1234, "John", , 2.83}; // illegal

Cannot initialize in the structure declaration, since this does not allocate memory

Copyright 2012 Pearson Education, Inc.

Excerpts From Program 11-3

Copyright 2012 Pearson Education, Inc.

11.5
Arrays of Structures

Copyright 2012 Pearson Education, Inc.

Arrays of Structures
Structures can be defined in arrays Can be used in place of parallel arrays
const int NUM_STUDENTS = 20; Student stuList[NUM_STUDENTS];

Individual structures accessible using subscript notation Fields within structures accessible using dot notation:
cout << stuList[5].studentID;

Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

11.6
Nested Structures

Copyright 2012 Pearson Education, Inc.

Nested Structures
A structure can contain another structure as a member:
struct PersonInfo { string name, address, city; }; struct Student { int studentID; PersonInfo pData; short yearInSchool; double gpa; };
Copyright 2012 Pearson Education, Inc.

Members of Nested Structures


Use the dot operator multiple times to refer to fields of nested structures:
Student s; s.pData.name = "Joanne"; s.pData.city = "Tulsa";

Copyright 2012 Pearson Education, Inc.

11.7
Structures as Function Arguments

Copyright 2012 Pearson Education, Inc.

Structures as Function Arguments


May pass members of struct variables to functions:
computeGPA(stu.gpa);

May pass entire struct variables to functions:


showData(stu);

Can use reference parameter if function needs to modify contents of structure variable

Copyright 2012 Pearson Education, Inc.

Excerpts from Program 11-6

Copyright 2012 Pearson Education, Inc.

Structures as Function Arguments - Notes


Using value parameter for structure can slow down a program, waste space Using a reference parameter will speed up program, but function may change data in structure Using a const reference parameter allows read-only access to reference parameter, does not waste space, speed

Copyright 2012 Pearson Education, Inc.

Revised showItem Function

Copyright 2012 Pearson Education, Inc.

11.8
Returning a Structure from a Function

Copyright 2012 Pearson Education, Inc.

Returning a Structure from a Function


Function can return a struct:
Student getStudentData(); stu1 = getStudentData(); // prototype // call

Function must define a local structure


for internal use for use with return statement

Copyright 2012 Pearson Education, Inc.

Returning a Structure from a Function - Example


Student getStudentData() { Student tempStu; cin >> tempStu.studentID; getline(cin, tempStu.pData.name); getline(cin, tempStu.pData.address); getline(cin, tempStu.pData.city); cin >> tempStu.yearInSchool; cin >> tempStu.gpa; return tempStu; }

Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

11.9
Pointers to Structures

Copyright 2012 Pearson Education, Inc.

Pointers to Structures
A structure variable has an address Pointers to structures are variables that can hold the address of a structure:
Student *stuPtr;

Can use & operator to assign address:


stuPtr = & stu1;

Structure pointer can be a function parameter


11-137
Copyright 2012 Pearson Education, Inc.

Accessing Structure Members via Pointer Variables


Must use () to dereference pointer variable, not field within structure:
cout << (*stuPtr).studentID;

Can use structure pointer operator to eliminate () and use clearer notation:
cout << stuPtr->studentID;

11-138
Copyright 2012 Pearson Education, Inc.

From Program 11-8

Copyright 2012 Pearson Education, Inc.

11.11
Unions

Copyright 2012 Pearson Education, Inc.

Unions
Similar to a struct, but
all members share a single memory location, and only one member of the union can be used at a time

Declared using union, otherwise the same as struct Variables defined as for struct variables

Copyright 2012 Pearson Education, Inc.

Anonymous Union
A union without a union tag:
union { ... };

Must use static if declared outside of a function

Allocates memory at declaration time


Can refer to members directly without dot operator

Uses only one memory location, saves space

Copyright 2012 Pearson Education, Inc.

11.12
Enumerated Data Types

Copyright 2012 Pearson Education, Inc.

Enumerated Data Types


An enumerated data type is a programmerdefined data type. It consists of values known as enumerators, which represent integer constants.

Copyright 2012 Pearson Education, Inc.

Enumerated Data Types


Example:
enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY };

The identifiers MONDAY, TUESDAY, WEDNESDAY, THURSDAY, and FRIDAY, which are listed inside the braces, are enumerators. They represent the values that belong to the Day data type.
Copyright 2012 Pearson Education, Inc.

Enumerated Data Types


enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY };
Note that the enumerators are not strings, so they arent enclosed in quotes. They are identifiers.

Copyright 2012 Pearson Education, Inc.

Enumerated Data Types


Once you have created an enumerated data type in your program, you can define variables of that type. Example: Day workDay; This statement defines workDay as a variable of the Day type.
Copyright 2012 Pearson Education, Inc.

Enumerated Data Types


We may assign any of the enumerators MONDAY, TUESDAY, WEDNESDAY, THURSDAY, or FRIDAY to a variable of the Day type. Example:
workDay = WEDNESDAY;

Copyright 2012 Pearson Education, Inc.

Enumerated Data Types


So, what is an enumerator? Think of it as an integer named constant Internally, the compiler assigns integer values to the enumerators, beginning at 0.

Copyright 2012 Pearson Education, Inc.

Enumerated Data Types


enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY };
In memory...
MONDAY = 0 TUESDAY = 1 WEDNESDAY = 2 THURSDAY = 3 FRIDAY = 4
Copyright 2012 Pearson Education, Inc.

Enumerated Data Types


Using the Day declaration, the following code... cout << MONDAY << " " << WEDNESDAY << " << FRIDAY << endl; ...will produce this output: 0 2 4
Copyright 2012 Pearson Education, Inc.

Assigning an integer to an enum Variable


You cannot directly assign an integer value to an enum variable. This will not work: workDay = 3; // Error!
Instead, you must cast the integer:

workDay = static_cast<Day>(3);

Copyright 2012 Pearson Education, Inc.

Assigning an Enumerator to an int Variable


You CAN assign an enumerator to an int variable. For example: int x; x = THURSDAY; This code assigns 3 to x.

Copyright 2012 Pearson Education, Inc.

Comparing Enumerator Values


Enumerator values can be compared using the relational operators. For example, using the Day data type the following code will display the message "Friday is greater than Monday.
if (FRIDAY > MONDAY) { cout << "Friday is greater " << "than Monday.\n"; }
Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

Program 11-12 (Continued)

Copyright 2012 Pearson Education, Inc.

Enumerated Data Types


Program 11-12 shows enumerators used to control a loop:
// Get the sales for each day. for (index = MONDAY; index <= FRIDAY; index++) { cout << "Enter the sales for day " << index << ": "; cin >> sales[index]; }
11-157
Copyright 2012 Pearson Education, Inc.

Anonymous Enumerated Types


An anonymous enumerated type is simply one that does not have a name. For example, in Program 11-13 we could have declared the enumerated type as: enum { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY };

Copyright 2012 Pearson Education, Inc.

Using Math Operators with enum Variables


You can run into problems when trying to perform math operations with enum variables. For example: Day day1, day2; // Define two Day variables. day1 = TUESDAY; // Assign TUESDAY to day1. day2 = day1 + 1;// ERROR! Will not work! The third statement will not work because the expression day1 + 1 results in the integer value 2, and you cannot store an int in an enum variable.

Copyright 2012 Pearson Education, Inc.

Using Math Operators with enum Variables


You can fix this by using a cast to explicitly convert the result to Day, as shown here:
// This will work. day2 = static_cast<Day>(day1 + 1);

Copyright 2012 Pearson Education, Inc.

Using an enum Variable to Step through an Array's Elements


Because enumerators are stored in memory as integers, you can use them as array subscripts. For example:
enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY }; const int NUM_DAYS = 5; double sales[NUM_DAYS]; sales[MONDAY] = 1525.0; sales[TUESDAY] = 1896.5; sales[WEDNESDAY] = 1975.63; sales[THURSDAY] = 1678.33; sales[FRIDAY] = 1498.52;

Copyright 2012 Pearson Education, Inc.

Using an enum Variable to Step through an Array's Elements


Remember, though, you cannot use the ++ operator on an enum variable. So, the following loop will NOT work.
Day workDay; // Define a Day variable // ERROR!!! This code will NOT work. for (workDay = MONDAY; workDay <= FRIDAY; workDay++) { cout << "Enter the sales for day " << workDay << ": "; cin >> sales[workDay]; }

Copyright 2012 Pearson Education, Inc.

Using an enum Variable to Step through an Array's Elements


You must rewrite the loops update expression using a cast instead of ++:
for (workDay = MONDAY; workDay <= FRIDAY; workDay = static_cast<Day>(workDay + 1)) { cout << "Enter the sales for day " << workDay << ": "; cin >> sales[workDay]; }

Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

Enumerators Must Be Unique Within the same Scope


Enumerators must be unique within the same scope. For example, an error will result if both of the following enumerated types are declared within the same scope:
enum Presidents { MCKINLEY, ROOSEVELT, TAFT };
enum VicePresidents { ROOSEVELT, FAIRBANKS, SHERMAN };

ROOSEVELT is declared twice.


Copyright 2012 Pearson Education, Inc.

Declaring the Type and Defining the Variables in One Statement


You can declare an enumerated data type and define one or more variables of the type in the same statement. For example:
enum Car { PORSCHE, FERRARI, JAGUAR } sportsCar;

This code declares the Car data type and defines a variable named sportsCar.

Copyright 2012 Pearson Education, Inc.

Chapter 12:
Advanced File Operations

Copyright 2012 Pearson Education, Inc.

12.1
File Operations

Copyright 2012 Pearson Education, Inc.

File Operations
File: a set of data stored on a computer, often on a disk drive Programs can read from, write to files Used in many applications:
Word processing Databases Spreadsheets Compilers

Copyright 2012 Pearson Education, Inc.

Using Files
1. Requires fstream header file
use ifstream data type for input files use ofstream data type for output files use fstream data type for both input, output files

2. Can use >>, << to read from, write to a file 3. Can use eof member function to test for end of input file

Copyright 2012 Pearson Education, Inc.

fstream Object
fstream object can be used for either input or output Must specify mode on the open statement Sample modes:
ios::in input ios::out output

Can be combined on open call:


dFile.open("class.txt", ios::in | ios::out);

Copyright 2012 Pearson Education, Inc.

File Access Flags

Copyright 2012 Pearson Education, Inc.

Using Files - Example


// copy 10 numbers between files // open the files fstream infile("input.txt", ios::in); fstream outfile("output.txt", ios::out); int num; for (int i = 1; i <= 10; i++) { infile >> num; // use the files outfile << num; } infile.close(); // close the files outfile.close();
Copyright 2012 Pearson Education, Inc.

Default File Open Modes


ifstream:
open for input only file cannot be written to open fails if file does not exist

ofstream:
open for output only file cannot be read from file created if no file exists file contents erased if file exists

Copyright 2012 Pearson Education, Inc.

More File Open Details


Can use filename, flags in definition:
ifstream gradeList("grades.txt");

File stream object set to 0 (false) if open failed:


if (!gradeList) ...

Can also check fail member function to detect file open error:
if (gradeList.fail()) ...
Copyright 2012 Pearson Education, Inc.

12.2
File Output Formatting

Copyright 2012 Pearson Education, Inc.

File Output Formatting


Use the same techniques with file stream objects as with cout: showpoint, setw(x), showprecision(x), etc.
Requires iomanip to use manipulators

Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

Program 12-3 (Continued)

Copyright 2012 Pearson Education, Inc.

12.3
Passing File Stream Objects to Functions

Copyright 2012 Pearson Education, Inc.

Passing File Stream Objects to Functions


It is very useful to pass file stream objects to functions Be sure to always pass file stream objects by reference

Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

12.4
More Detailed Error Testing

Copyright 2012 Pearson Education, Inc.

More Detailed Error Testing


Can examine error state bits to determine stream status Bits tested/cleared by stream member functions
ios::eofbit ios::failbit ios::hardfail ios::badbit ios::goodbit set when end of file detected set when operation failed set when error occurred and no recovery set when invalid operation attempted set when no other bits are set

Copyright 2012 Pearson Education, Inc.

Member Functions / Flags


eof() true if eofbit set, false otherwise

fail()
bad() good() clear()

true if failbit or hardfail set, false otherwise


true if badbit set, false otherwise true if goodbit set, false otherwise clear all flags (no arguments), or clear a specific flag

Copyright 2012 Pearson Education, Inc.

From Program 12-6

Copyright 2012 Pearson Education, Inc.

12.5
Member Functions for Reading and Writing Files

Copyright 2012 Pearson Education, Inc.

Member Functions for Reading and Writing Files


Functions that may be used for input with whitespace, to perform single character I/O, or to return to the beginning of an input file Member functions:
getline: reads input including whitespace get: reads a single character put: writes a single character

Copyright 2012 Pearson Education, Inc.

The getline Function


Three arguments:
Name of a file stream object Name of a string object Delimiter character of your choice Examples, using the file stream object myFile, and the string objects name and address: getline(myFile, name); getline(myFile, address, '\t');

If left out, '\n' is default for third argument

Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

Single Character I/O


get: read a single character from a file
char letterGrade; gradeFile.get(letterGrade);
Will read any character, including whitespace

put: write a single character to a file


reportFile.put(letterGrade);

Copyright 2012 Pearson Education, Inc.

12.6
Working with Multiple Files

Copyright 2012 Pearson Education, Inc.

Working with Multiple Files


Can have more than file open at a time in a program Files may be open for input or output Need to define file stream object for each file

Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

Copyright 2012 Pearson Education, Inc.

12.7
Binary Files

Copyright 2012 Pearson Education, Inc.

Binary Files
Binary file contains unformatted, non-ASCII data
Indicate by using binary flag on open:
inFile.open("nums.dat", ios::in | ios::binary);

12-202
Copyright 2012 Pearson Education, Inc.

Binary Files
Use read and write instead of <<, >>
char ch; // read in a letter from file inFile.read(&ch, sizeof(ch));
address of where to put the data being read in. The read function expects to read chars

how many bytes to read from the file

// send a character to a file outFile.write(&ch, sizeof(ch));


12-203
Copyright 2012 Pearson Education, Inc.

Binary Files
To read, write non-character data, must use a typecast operator to treat the address of the data as a character address
int num; // read in a binary number from a file inFile.read(reinterpret_cast<char *>&num, sizeof(num)); treat the address of num as
the address of a char

// send a binary value to a file outf.write(reinterpret_cast<char *>&num, sizeof(num));


Copyright 2012 Pearson Education, Inc.

12.8
Creating Records with Structures

Copyright 2012 Pearson Education, Inc.

Creating Records with Structures


Can write structures to, read structures from files To work with structures and files,
use ios::binary file flag upon open use read, write member functions

12-206
Copyright 2012 Pearson Education, Inc.

Creating Records with Structures


struct TestScore { int studentId; double score; char grade; }; TestScore oneTest; ... // write out oneTest to a file gradeFile.write(reinterpret_cast<char *> (&oneTest), sizeof(oneTest));
12-207
Copyright 2012 Pearson Education, Inc.

12.9
Random-Access Files

Copyright 2012 Pearson Education, Inc.

Random-Access Files
Sequential access: start at beginning of file and go through data in file, in order, to end
to access 100th entry in file, go through 99 preceding entries first

Random access: access data in a file in any order


can access 100th entry directly
12-209
Copyright 2012 Pearson Education, Inc.

Random Access Member Functions


seekg (seek get): used with files open for input
seekp (seek put): used with files open for output Used to go to a specific position in a file

12-210
Copyright 2012 Pearson Education, Inc.

Random Access Member Functions


seekg,seekp arguments:
offset: number of bytes, as a long mode flag: starting point to compute offset

Examples:
inData.seekg(25L, ios::beg); // set read position at 26th byte // from beginning of file outData.seekp(-10L, ios::cur); // set write position 10 bytes // before current position
12-211
Copyright 2012 Pearson Education, Inc.

Important Note on Random Access


If eof is true, it must be cleared before seekg or seekp:
gradeFile.clear(); gradeFile.seekg(0L, ios::beg); // go to the beginning of the file

12-212
Copyright 2012 Pearson Education, Inc.

Random Access Information


tellg member function: return current byte position in input file
long int whereAmI; whereAmI = inData.tellg();

tellp member function: return current byte position in output file


whereAmI = outData.tellp();
12-213
Copyright 2012 Pearson Education, Inc.

12.10
Opening a File for Both Input and Output

Copyright 2012 Pearson Education, Inc.

Opening a File for Both Input and Output


File can be open for input and output simultaneously Supports updating a file:
read data from file into memory update data write data back to file

Use fstream for file object definition:


fstream gradeList("grades.dat", ios::in | ios::out);

Can also use ios::binary flag for binary data

Copyright 2012 Pearson Education, Inc.

You might also like