today’s objectives

53
1 Today’s Objectives Announcements Homework #5 is due next Monday, July 24. Since this date is so close to the end of the semester, no late assignments will be accepted and email will NOT be accepted! Quiz #4 File Processing (Ch. 17) Files and streams Reading from files Writing to files Adding structure to files Using seekg, seekp, tellg, and tellp Data Structures (Ch. 21) Self-referential structures and classes Linked lists 19-Jul-2006

Upload: thora

Post on 19-Jan-2016

24 views

Category:

Documents


0 download

DESCRIPTION

19-Jul-2006. Today’s Objectives. Announcements Homework #5 is due next Monday, July 24. Since this date is so close to the end of the semester, no late assignments will be accepted and email will NOT be accepted! Quiz #4 File Processing (Ch. 17) Files and streams Reading from files - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Today’s Objectives

1

Today’s ObjectivesToday’s Objectives

Announcements• Homework #5 is due next Monday, July 24. Since this date is so close to

the end of the semester, no late assignments will be accepted and email will NOT be accepted!

Quiz #4 File Processing (Ch. 17)

• Files and streams• Reading from files• Writing to files• Adding structure to files• Using seekg, seekp, tellg, and tellp

Data Structures (Ch. 21)• Self-referential structures and classes• Linked lists

19-Jul-200619-Jul-2006

Page 2: Today’s Objectives

2

Quiz #4Quiz #4

Closed book

20 minutes

Please clear your desks andlog off from the computer

Page 3: Today’s Objectives

3

File ProcessingFile Processing

Chapter 17

Page 4: Today’s Objectives

4

Files and StreamsFiles and Streams

File• Used to store data• Storing data in a file makes the data “persistent”

File = a sequence of bytes• Stream = a sequence of bytes• When a file is opened, a stream object is associated

with the file• The stream object connects the file with your program

File Processing (Deitel, 844)File Processing (Deitel, 844)

Page 5: Today’s Objectives

5

File Stream Classes and HeaderFile Stream Classes and Header

<fstream> ifstream

• Used for input from a file• From the template class basic_ifstream<>

ofstream• Used for output from a file• From the template class basic_ofstream<>

fstream• Used for both output and input with a file• From the template class basic_fstream<>

File Processing (Deitel, 845)File Processing (Deitel, 845)

Page 6: Today’s Objectives

6

Reading from a FileReading from a File

char *filename = "movies.dat";ifstream inFile( filename ); //open for reading

File Processing (Deitel, 847)File Processing (Deitel, 847)

Name of the class that is used for input from a file

Name of the stream object

Filename as a C-style string

Page 7: Today’s Objectives

7

Reading from a FileReading from a File

char *filename = "movies.dat";ifstream inFile( filename ); //open for readingif( !inFile ) {cerr << "Unable to open " << filename << endl;

}

File Processing (Deitel, 847)File Processing (Deitel, 847)

It’s a good idea to check whether the file was opened successfully!

• Use operator! to check the state of the stream object

• Checks the failbit

Page 8: Today’s Objectives

8

Reading from a FileReading from a File

char *filename = "movies.dat";ifstream inFile( filename ); //open for readingif( !inFile ) {cerr << "Unable to open " << filename << endl;

}else {while( !inFile.eof() ) {

Movie tempMovie;inFile >> tempMovie; //reading from the

filestore.addRentalItem(tempMovie);

}

File Processing (Deitel, 847)File Processing (Deitel, 847)

A stream’s eof() function returns true if the end of the stream has been reached.

Page 9: Today’s Objectives

9

Reading from a FileReading from a File

char *filename = "movies.dat";ifstream inFile( filename ); //open for readingif( !inFile ) {cerr << "Unable to open " << filename << endl;

}else {while( !inFile.eof() ) {

Movie tempMovie;inFile >> tempMovie; //reading from the

filestore.addRentalItem(tempMovie);

}inFile.close();

}

File Processing (Deitel, 847)File Processing (Deitel, 847)

What would be likely to happen if we did not explicitly close the file? Hint: “infile” is an object.

Page 10: Today’s Objectives

10

Writing to a FileWriting to a File

char *filename = "customers.dat";ofstream outFile( filename ); //open for writing

File Processing (Deitel, 847)File Processing (Deitel, 847)

Name of the class that is used for output to a file

Name of the stream object

Filename as a C-style string

Page 11: Today’s Objectives

11

Writing to a FileWriting to a File

char *filename = "customers.dat";ofstream outFile( filename ); //open for writingif( !outFile ) {

cerr << "Unable to open " << filename << endl;}

File Processing (Deitel, 847)File Processing (Deitel, 847)

Check whether the file was opened successfully!

Page 12: Today’s Objectives

12

Writing to a FileWriting to a File

char *filename = "customers.dat";ofstream outFile( filename ); //open for writingif( !outFile ) {

cerr << "Unable to open " << filename << endl;}else {

for( int i=0; i<sz; ++i ){outFile << myData[i].getID() << '\n';outFile << myData[i].getFirstName() << '\

n';outFile << myData[i].getLastName();if( i < sz - 1 ) outFile << '\n';

}

File Processing (Deitel, 847)File Processing (Deitel, 847)

Write the data to the file.

Page 13: Today’s Objectives

13

Writing to a FileWriting to a File

char *filename = "customers.dat";ofstream outFile( filename ); //open for writingif( !outFile ) {

cerr << "Unable to open " << filename << endl;}else {

for( int i=0; i<sz; ++i ){outFile << myData[i].getID() << '\n';outFile << myData[i].getFirstName() << '\

n';outFile << myData[i].getLastName();if( i < sz - 1 ) outFile << '\n';

}outFile.close();

}

File Processing (Deitel, 847)File Processing (Deitel, 847)

Page 14: Today’s Objectives

14

Opening FilesOpening Files

A stream object can be created without opening a fileofstream outFile;

Then it can be opened lateroutFile.open("customers.dat");

If a file is opened for output and it does not already exist, a new file will be created automatically

File Processing (Deitel, 848; Lippman, 1097)File Processing (Deitel, 848; Lippman, 1097)

Page 15: Today’s Objectives

15

Appending to a FileAppending to a File

By default, when an ofstream object is opened for output, all data already stored in the file is discarded

To keep the data that is in the file and add more data to the end, open the file in append mode

ofstream outFile( "customers.dat", ios::app );

File Processing (Deitel, 847; Lippman, 1097)File Processing (Deitel, 847; Lippman, 1097)

Specifies the file open mode, see Fig. 17.5, page 847.

ios::app specifies append modeios::out specifies output mode, discard the content

Page 16: Today’s Objectives

16

Using Objects of fstreamUsing Objects of fstream

fstream is used for both input from a file and output to a file

Use the mode argument to specify whether input, output, or both

fstream io("customers.dat", ios::in|ios::app );

File Processing (Deitel, 847; Lippman, 1102)File Processing (Deitel, 847; Lippman, 1102)

Specify more than one mode by using the bitwise OR operator

Page 17: Today’s Objectives

17

Unstructured StreamsUnstructured Streams

If we write data to a file as an unstructured byte stream, we may not be able to retrieve it easily

Example• If we have an array of Customer objects and we write them to a

file like this:for( int i=0; i<sz; ++i ){outFile << myData[i].getID();outFile << myData[i].getFirstName();outFile << myData[i].getLastName();

}

• Then the bytes will be written as an unstructured byte stream, and we will not be able to separate the data when the file is read

1001AlanTuring1002CharlesBabbage

File Processing (Deitel, 844; Folk, 119)File Processing (Deitel, 844; Folk, 119)

Page 18: Today’s Objectives

18

Fields and RecordsFields and Records

When working with files, the data is said to be composed of fundamental units called “fields” and “records”

Field = the smallest unit of meaningful data• Examples: “firstName” and “lastName”

Record = the set of fields that belong together• Example: each Customer object is a record that

contains several fields

File Processing (Deitel, 843; Folk, 120–125)File Processing (Deitel, 843; Folk, 120–125)

Page 19: Today’s Objectives

19

Adding Structure to FilesAdding Structure to Files

If the data is structured inside the file (i.e., the fields and records are separated), then the data can be retrieved or changed easily

There are many ways to add structure to a file Common methods to keep fields separated

• Use fields that have a set length1001 Alan Turing 1002 CharlesBabbage

• Place a delimiter at the end of each field1001AlanTuring 1002CharlesBabbage

File Processing (Deitel, 843; Folk, 120–125)File Processing (Deitel, 843; Folk, 120–125)

Page 20: Today’s Objectives

20

Structured RecordsStructured Records

Record = the set of fields that belong together Usually, a record is equivalent to the data for

one object Common methods to keep records separated

• Use records that have a set length1001 Alan Turing 1002 CharlesBabbage

• Make records a set number of fields1001AlanTuring 1002CharlesBabbage

File Processing (Deitel, 843; Folk, 120–126)File Processing (Deitel, 843; Folk, 120–126)

Page 21: Today’s Objectives

21

Retrieving DataRetrieving Data

When a file is structured, we can retrieve its data easily

Sequentially• Read data from the beginning to the end, inserting it

into variables or objects

Randomly• Go directly to a specific record and read it• seekg

File Processing (Deitel, 843; Folk, 120–126)File Processing (Deitel, 843; Folk, 120–126)

Page 22: Today’s Objectives

22

Retrieving Data SequentiallyRetrieving Data SequentiallyFile Processing (Deitel, 843; Folk, 120–126)File Processing (Deitel, 843; Folk, 120–126)

1001TuringAlan1002BabbageCharles

Example file structure:• Fields are separated by ‘\n’• Each record has three lines

string ID, lName, fName;ifstream inFile( "customers.dat" );if( !inFile ) cerr << "Unable to open file." << endl;else {

while( !inFile.eof() ) {inFile >> ID;inFile >> lName;inFile >> fName;Customer tempCustomer( ID, lName, fName );store.addCustomer(tempCustomer);

}inFile.close();

}

Page 23: Today’s Objectives

23

Retrieving Data SequentiallyRetrieving Data SequentiallyFile Processing (Deitel, 843; Folk, 120–126)File Processing (Deitel, 843; Folk, 120–126)

1001TuringAlan1002BabbageCharles

Example file structure:• Fields are separated by ‘\n’• Each record has three lines

string ID, lName, fName;ifstream inFile( "customers.dat" );if( !inFile ) cerr << "Unable to open file." << endl;else {

while( !inFile.eof() ) {inFile >> ID;inFile >> lName;inFile >> fName;Customer tempCustomer( ID, lName, fName );store.addCustomer(tempCustomer);

}inFile.close();

}

Page 24: Today’s Objectives

24

Using seekgUsing seekg

seekg()• Member function of the istream class• First argument is the number of the byte in the file that

the next input will get• Second argument is optional, and it is the direction for

positioning, default is the beginning of the stream – ios::beg, ios::cur, ios::end

• Examplestring temp;ifstream inFile("customers.dat");inFile.seekg(10);inFile >> temp; //string beginning at byte 10

File Processing (Deitel, 851; Lippman, 1102)File Processing (Deitel, 851; Lippman, 1102)

Page 25: Today’s Objectives

25

Retrieving Data RandomlyRetrieving Data RandomlyFile Processing (Deitel, 851–826)File Processing (Deitel, 851–826)

1001 Turing Alan 1002 Babbage Charles 1003 Lovelace Ada

Example file structure:• Fields separated by whitespace• Each record has 23 bytes

const int RECORDSIZE = 23; long recordNumber = 0;string ID, lName, fName;ifstream inFile( "customers.dat" );if( !inFile ) cerr << "Unable to open file." << endl;else{

cout << "Enter the number of a record: ";cin >> recordNumber;while( recordNumber > -1 && recordNumber < 2 ){

inFile.seekg( recordNumber * RECORDSIZE, ios::beg );inFile >> ID >> lName >> fName;Customer tempCustomer( ID, lName, fName );cout << "The customer is: " << tempCustomer << endl;cout << "Enter the number of a record: ";cin >> recordNumber;

}inFile.close();

}

Page 26: Today’s Objectives

26

Using seekpUsing seekp

seekp()• Member function of the ostream class• First argument is the number of the byte in the file

where the next output will start• Second argument is optional, and it is the direction for

positioning, default is the beginning of the stream – ios::beg, ios::cur, ios::end

• Exampleconst int RECORDSIZE = 23;ofstream outFile("customers.dat");outFile.seekp( n * RECORDSIZE );outFile.write("1005 ",5);//changes the ID

File Processing (Deitel, 851; Lippman, 1102)File Processing (Deitel, 851; Lippman, 1102)

Page 27: Today’s Objectives

27

Using tellg, tellpUsing tellg, tellp

tellg()• Member function of the istream class• Returns the current byte in the input file• Example

long pos = inFile.tellg();

tellp()• Member function of the ostream class• Returns the current byte in the output file

Used to mark a position in the file so that the program can return to it laterinFile.seekg( pos );

File Processing (Deitel, 851; Lippman, 1102)File Processing (Deitel, 851; Lippman, 1102)

Page 28: Today’s Objectives

28

Data StructuresData Structures

Chapter 21

Page 29: Today’s Objectives

29

Data StructureData Structure

“ A systematic way of organizing and accessing data” in a computer’s memory

Data Structures (Goodrich, 108)Data Structures (Goodrich, 108)

Simple data structures – an array, a vector, a struct, a class

More complex data structures often use self-referential structures or classes

Page 30: Today’s Objectives

30

Self-Referential StructSelf-Referential Struct

Contains a data field that holds a data value Contains one or more data fields that hold a

pointer to another struct object of the same type

struct Node {char element;Node *next;

};

Data Structures (Deitel, 1000)Data Structures (Deitel, 1000)

Page 31: Today’s Objectives

31

Struct with a ConstructorStruct with a Constructor

In C++, a struct can have a constructorstruct Node {

char element;Node *next;Node(char e=' ',Node *p=NULL):element(e),next(p){}

};

Data Structures (Deitel, 1000)Data Structures (Deitel, 1000)

Page 32: Today’s Objectives

32

Self-Referential ClassSelf-Referential Class

Contains a data field that holds a data value Contains one or more data fields that hold a

pointer to another object of the same typeclass CNode {public:

CNode(char e=' ',CNode *p=NULL):element(e),next(p){}void setElement( char c ){ element = c; }char getElement(){ return element; }void setNext( CNode *p ){ next = p; }CNode *getNext(){ return next; }

private:char element;CNode *next;

};

Data Structures (Deitel, 1000)Data Structures (Deitel, 1000)

Page 33: Today’s Objectives

33

Building a Data Structure with Self-Referential Objects

Building a Data Structure with Self-Referential Objects

Self-referential objects can be linked together to hold a collection of related data• Similar to an array• Linked list – a type of data structure built from self-

referential objects

LinkedList

Data Structures (Deitel, 1000)Data Structures (Deitel, 1000)

Collection of objects

Each object has a pointer that points to the next object

Page 34: Today’s Objectives

34

Similarities and Differences Between Arrays and Linked Lists

Similarities and Differences Between Arrays and Linked Lists

Similarities• Both store data in memory• Both store data in a sequence

Differences• Array is one block of contiguous

memory• List is a collection of scattered

memory cells

Array

LinkedList

Data Structures (Deitel, 1000)Data Structures (Deitel, 1000)

Page 35: Today’s Objectives

35

Linked List ExampleLinked List Example

We normally use a pointer to keep track of the location of the first node, called the “head node”

Each subsequent node in the list is accessed by the pointer member inside the previous node

We often use another pointer to keep track of the last node, called the “tail”

The pointer in the last node is set to NULL

NULL

struct Node { char element; Node *next;};

*next;

struct Node { char element; Node *next;};

*next;

struct Node { char element; Node *next;};

*next;

pHead

Data Structures (Deitel, 1000)Data Structures (Deitel, 1000)

pTail

Page 36: Today’s Objectives

36

Arrays vs. Linked ListsArrays vs. Linked Lists

Arrays

Advantages• Simple• Fast performance

Drawbacks• Size is fixed – we use

up the space even if we don’t need it

• Size must be determined in advance

Linked Lists

Advantages• No fixed size – use only

space we need• We can add more nodes

at any time

Drawbacks• Additional time for

allocating memory during program execution

• More complicated code

Data Structures (Deitel, 1000)Data Structures (Deitel, 1000)

Page 37: Today’s Objectives

37

Using a Linked ListUsing a Linked List

If we create a class for our linked list, then we can encapsulate all of the list’s data and the operations that we can do with the list

Operations (member functions)• size• push_front• pop_front• printList

Data members• size• A pointer to the head node

Data Structures (Deitel, 1000)Data Structures (Deitel, 1000)

Page 38: Today’s Objectives

38

Starting a List ClassStarting a List Class

class List{private:struct Node {

char element;Node *next;Node(char e=' ',Node *p=NULL):element(e),next(p)

{}};

public:List();int size();void push_front( char e );void pop_front();void printList();

private:int sz;Node *pHead;

};

Data Structures (Deitel, 1000)Data Structures (Deitel, 1000)

Page 39: Today’s Objectives

39

Defining Some Member FunctionsDefining Some Member Functions

List::List(){sz = 0;pHead = NULL;

}

int List::size(){return sz;

}

Data Structures (Deitel, 1000)Data Structures (Deitel, 1000)

Page 40: Today’s Objectives

40

Visualizing push_frontVisualizing push_frontData Structures (Deitel, 1000, Goodrich, 177)Data Structures (Deitel, 1000, Goodrich, 177)

pHead

NULLf next g next h next

Page 41: Today’s Objectives

41

Visualizing push_frontVisualizing push_frontData Structures (Deitel, 1000, Goodrich, 177)Data Structures (Deitel, 1000, Goodrich, 177)

next1.pHead

e

pHead

NULLf next g next h next

//Create a new node//Put the data into its data element//Put the address in pHead into its “next” pointer

Page 42: Today’s Objectives

42

Visualizing push_frontVisualizing push_frontData Structures (Deitel, 1000, Goodrich, 177)Data Structures (Deitel, 1000, Goodrich, 177)

next1.pHead

e

pHead

NULLf next g next h next

pHead

e next NULLf next g next h next2.

//Make pHead point to the new node

Page 43: Today’s Objectives

43

Visualizing push_frontVisualizing push_frontData Structures (Deitel, 1000, Goodrich, 177)Data Structures (Deitel, 1000, Goodrich, 177)

next1.pHead

e

pHead

NULLf next g next h next

pHead

e next NULLf next g next h next2.

pHead

e next NULLf next g next h next3.

Page 44: Today’s Objectives

44

Coding push_frontCoding push_front

//Create a new node//Put the data into its data element//Put the address in pHead into its “next” pointer

pHead = v;

//Make pHead point to the new node

Node *v = new Node( 'e', pHead );

Data Structures (Deitel, 1000, Goodrich, 177)Data Structures (Deitel, 1000, Goodrich, 177)

sz++;

//Increase the size

Page 45: Today’s Objectives

45

Visualizing printListVisualizing printList

We use a temporary node to print the elements stored in a linked list

Data Structures (Deitel, 1000, Goodrich, 177)Data Structures (Deitel, 1000, Goodrich, 177)

pHead

NULLf next g next h next

current

//Start at the head and print its element

next

Page 46: Today’s Objectives

46

Visualizing printListVisualizing printList

We use a temporary node to print the elements stored in a linked list

Data Structures (Deitel, 1000, Goodrich, 177)Data Structures (Deitel, 1000, Goodrich, 177)

pHead

NULLf next g next h next

//Start at the head and print its element//Then get the next node and print its element

currentnext

Page 47: Today’s Objectives

47

Visualizing printListVisualizing printList

We use a temporary node to print the elements stored in a linked list

Data Structures (Deitel, 1000, Goodrich, 177)Data Structures (Deitel, 1000, Goodrich, 177)

pHead

NULLf next g next h next

//Start at the head and print its element//Then get the next node and print its element

currentnext

Page 48: Today’s Objectives

48

Visualizing printListVisualizing printList

We use a temporary node to print the elements stored in a linked list

Data Structures (Deitel, 1000, Goodrich, 177)Data Structures (Deitel, 1000, Goodrich, 177)

pHead

NULLf next g next h next

//Start at the head and print its element//Then get the next node and print its element//Stop when it’s NULL

currentnext

Page 49: Today’s Objectives

49

Coding printListCoding printList

void List::printList(){Node *current = pHead;while( current ){

cout << current->element << " ";current = current->next;

}}

Data Structures (Deitel, 1000, Goodrich, 177)Data Structures (Deitel, 1000, Goodrich, 177)

Start at the headStop if it’s NULL

Print the element

Get the next node

Page 50: Today’s Objectives

50

Visualizing pop_frontVisualizing pop_front

//Save the address of the current head as “old head”//Make the head pointer point to node #2//Delete the old head

2.

pHead

e next NULLf next g next h next1.

oldHead =

pHead

e next NULLf next g next h next

oldHead

Data Structures (Deitel, 1000, Goodrich, 177)Data Structures (Deitel, 1000, Goodrich, 177)

Page 51: Today’s Objectives

51

Coding pop_frontCoding pop_front

//Save the address of the current head as “old head”//Make the head pointer point to node #2//Delete the old head//Reduce the size

Node *oldHead = pHead; //Hold it temporarilypHead = pHead->next; //Switch the pointerdelete oldHead; //Recover the memorysz--; //Reduce the size

Data Structures (Deitel, 1000, Goodrich, 177)Data Structures (Deitel, 1000, Goodrich, 177)

Page 52: Today’s Objectives

52

The DestructorThe Destructor

Every node in the list was created with new, so every node must be deleted

List::~List(){while( sz > 0 ){

pop_front();}

}

Data Structures (Deitel, 1000, Goodrich, 177)Data Structures (Deitel, 1000, Goodrich, 177)

Page 53: Today’s Objectives

53

ReferencesReferences

C++ Language Reference (MS Visual C++ Online Help), Redmond, Washington: Microsoft Corporation, 2001.

Deitel, H. M., and P. J. Deitel, C++ How to Program, Fifth Edition. Upper Saddle River, NJ: Prentice Hall, 2005.

Goodrich, M. T., R. Tamassia, and D. Mount, Data Structures and Algorithms in C++. Hoboken, NJ: John Wiley & Sons, Inc., 2004.

Josuttis, Nicolai M., The C++ Standard Library, A Tutorial and Reference. Boston: Addison-Wesley, 1999.