24
1 CS 103 Unit 14 - Streams

CS 103 Unit 14 -Streams - USC Bitsbits.usc.edu/files/cs103/slides/Unit14_Streams.pdf · 3 Kinds of Streams •I/O streams –Keyboard (cin) and monitor (cout) •File streams –Contents

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: CS 103 Unit 14 -Streams - USC Bitsbits.usc.edu/files/cs103/slides/Unit14_Streams.pdf · 3 Kinds of Streams •I/O streams –Keyboard (cin) and monitor (cout) •File streams –Contents

1

CS103Unit14- Streams

Page 2: CS 103 Unit 14 -Streams - USC Bitsbits.usc.edu/files/cs103/slides/Unit14_Streams.pdf · 3 Kinds of Streams •I/O streams –Keyboard (cin) and monitor (cout) •File streams –Contents

2

I/OStreams• '>>'operatorreadsfromastream(andconverttothedesiredtype)

– Alwaysskipsleadingwhitespace('\n', ' ', '\t')andstopsatfirsttrailingwhitespace

• '<<'operatorusedtowritedatatoanoutputstream– 'endl'forcesaflush…FlushforcestheOStomovedatafromtheinternalOSstreamto

theactualoutputdevice(likethemonitor)

7 5 y ...

input stream (user types all at once):

#include<iostream>using namespace std;int main(int argc, char *argv[]){int dummy, x; cin >> dummy >> x;

}

I t w a s t h e

output stream in OS:

#include<iostream>

using namespace std;

int main(int argc, char *argv[]){cout << "\tIt was the" << endl;cout << 4;

}

y ...input stream:4

output stream after flush:

4\n

It was the

6 1

\t

\t

\t

Page 3: CS 103 Unit 14 -Streams - USC Bitsbits.usc.edu/files/cs103/slides/Unit14_Streams.pdf · 3 Kinds of Streams •I/O streams –Keyboard (cin) and monitor (cout) •File streams –Contents

3

KindsofStreams

• I/Ostreams– Keyboard(cin)andmonitor(cout)

• Filestreams– Contentsoffilearethestreamofdata– #include<fstream>and#include<iostream>– ifstream andofstream objects

Page 4: CS 103 Unit 14 -Streams - USC Bitsbits.usc.edu/files/cs103/slides/Unit14_Streams.pdf · 3 Kinds of Streams •I/O streams –Keyboard (cin) and monitor (cout) •File streams –Contents

4

WhenDoesItFail

Forfile&eventuallystringstreams the

streamdoesn'tfailuntilyoureadPASTtheEOF

T h e e n d . \n

fp

EOFFile textchar buf[40];ifstream inf(argv[1]);

inf >> buf;

inf >> buf;

inf >> buf;

T h e \0buf

T h e e n d . \n

fp

EOFFile text

e n d \0buf

T h e e n d . \n

fp

EOFFile text

.

e n d \0buf

T h e e n d . \n

fp

EOFFile text

.

0

EOF BAD FAIL

0 0

0

EOF BAD FAIL

0 0

1

EOF BAD FAIL

0 1

Page 5: CS 103 Unit 14 -Streams - USC Bitsbits.usc.edu/files/cs103/slides/Unit14_Streams.pdf · 3 Kinds of Streams •I/O streams –Keyboard (cin) and monitor (cout) •File streams –Contents

5

WhichOption?#include<iostream>#include<fstream>using namespace std;int main(){vector<int> nums;ifstream ifile("data.txt");int x;while( !ifile.fail() ){

ifile >> x;nums.push_back(x);

}...}

#include<iostream>#include<fstream>using namespace std;int main(){vector<int> nums;ifstream ifile("data.txt");int x;while( 1 ){

ifile >> x;if(ifile.fail()) break;nums.push_back(x);

}...}

int x;while( ifile >> x ){nums.push_back(x);

}...

A stream returns itself after extractionA stream can be used as a bool (returns true if it hasn't failed)

Need to check for failure after you extract but before you store/use

7 8 EOF

data.txt

_

nums_ _ _

Page 6: CS 103 Unit 14 -Streams - USC Bitsbits.usc.edu/files/cs103/slides/Unit14_Streams.pdf · 3 Kinds of Streams •I/O streams –Keyboard (cin) and monitor (cout) •File streams –Contents

6

PatternforFileI/OorStreams

• Step1:Trytoreaddata(>>orgetline)• Step2:Check ifyousucceededorfailed• Step3:Onlyuse thedatareadfromstep1ifyousucceeded

• Ifyoureadandthenblindlyusethedatayouwilllikelygetabogusdatavalueattheend

Page 7: CS 103 Unit 14 -Streams - USC Bitsbits.usc.edu/files/cs103/slides/Unit14_Streams.pdf · 3 Kinds of Streams •I/O streams –Keyboard (cin) and monitor (cout) •File streams –Contents

7

RecallHowToGetLinesofText• Usingthe>>operatortogetaninput

stringoftext(char*orchar[]variablepassedtocin)implicitlystopsatthefirstwhitespace

• Howcanwegetawholelineoftext(includingspaces)– cin.getline(char*buf,int bufsize);– ifile.getline(char*buf,int bufsize);– Readsmaxofbufsize-1characters

(includingnewline)• Butgetline() useschar*(C-Strings)…

whatifwewanttouseC++strings???

#include <iostream> #include <fstream> using namespace std;

int main ()

{

char myline[100]; int i = 1;

ifstream ifile ("input.txt");

if( ifile.fail() ){ // can't open?return 1;

}

ifile.getline(myline, 100);while ( ! ifile.fail()) {cout << i++ << ": " << myline << endl;ifile.getline(myline, 100);}

ifile.close(); return 0;

}

The fox jumped over the log.

The bear ate some honey.

The CS student solved a hard problem.

1: The fox jumped over the log.

2: The bear ate some honey.

3: The CS student solved a hard problem.

input.txt

Page 8: CS 103 Unit 14 -Streams - USC Bitsbits.usc.edu/files/cs103/slides/Unit14_Streams.pdf · 3 Kinds of Streams •I/O streams –Keyboard (cin) and monitor (cout) •File streams –Contents

8

C++Stringgetline()• C++stringlibrary(#include<string>definesaglobalfunction(nota

memberofifstream orcin)thatcanreadalineoftextintoaC++string• Prototype:istream&getline(istream &is,string&str,chardelim);

– is=anyinputstream(ifstream,cin),etc.)– str =AC++stringthatitwillfillinwithtext– delim =Achartostopon(bydefaultitis'\n')whichiswhyitscalledgetline– Returnstheupdatedistream (the'is'objectyoupassedinasthe1st arg)

• Thetextfromtheinputstreamwillbereadupthroughthefirstoccurrenceof‘delim’andplacedintostr.Thedelimiterwillbestrippedfromtheendofstr andtheinputstreamwillbepointingatthefirstcharacterafter‘delim’.

int line_no = 0; ifstream myfile(argv[1]);

string myline; while ( getline( myfile, myline ) ){cout << "Read line: " << myline << endl;

}

Page 9: CS 103 Unit 14 -Streams - USC Bitsbits.usc.edu/files/cs103/slides/Unit14_Streams.pdf · 3 Kinds of Streams •I/O streams –Keyboard (cin) and monitor (cout) •File streams –Contents

9

STRINGSTREAMS

Page 10: CS 103 Unit 14 -Streams - USC Bitsbits.usc.edu/files/cs103/slides/Unit14_Streams.pdf · 3 Kinds of Streams •I/O streams –Keyboard (cin) and monitor (cout) •File streams –Contents

10

Introducing…Stringstreams

• I/Ostreams– Keyboard(cin)andmonitor(cout)

• Filestreams– Contentsoffilearethestreamofdata– #include<fstream>and#include<iostream>– ifstream andofstream objects

• Stringstreams – Contentsofastringarethestreamofdata– #include<sstream>and#include<iostream>– sstream object

Page 11: CS 103 Unit 14 -Streams - USC Bitsbits.usc.edu/files/cs103/slides/Unit14_Streams.pdf · 3 Kinds of Streams •I/O streams –Keyboard (cin) and monitor (cout) •File streams –Contents

11

C++StringStream

• Ifstreamsarejustsequencesofcharacters,aren'tstringsthemselveslikeastream?– The<sstream>libraryletsyoutreatC++stringobjectsliketheywerestreams

• Whywouldyouwanttotreatastringasastream?– Bufferupoutputforlaterdisplay– Parseoutthepiecesofastring– Datatypeconversions

• Veryusefulinconjunctionwithstring'sgetline(...)

Page 12: CS 103 Unit 14 -Streams - USC Bitsbits.usc.edu/files/cs103/slides/Unit14_Streams.pdf · 3 Kinds of Streams •I/O streams –Keyboard (cin) and monitor (cout) •File streams –Contents

12

C++StringStream

• Use<<and>>toconvertnumbersintostrings(i.e.12345=>"12345")

#include<sstream>using namespace std;int main(){stringstream ss;int num = 12345;ss << num;

string strNum;ss >> strNum;

return 0;}

sstream_test1.cpp

getp

EOFss

1 2 3 4 5

getp

EOFss

1 2 3 4 5

getp

EOFss

12345num

"12345"strNum

Page 13: CS 103 Unit 14 -Streams - USC Bitsbits.usc.edu/files/cs103/slides/Unit14_Streams.pdf · 3 Kinds of Streams •I/O streams –Keyboard (cin) and monitor (cout) •File streams –Contents

13

C++StringStream

• Use<<and>>toconvertstringsintonumbers(i.e."12345"=>12345)

#include<sstream>using namespace std;int main(){stringstream ss;string strNum = "12345";ss << strNum;

int num;ss >> num;return 0;}

sstream_test2.cpp

getp

EOFss

1 2 3 4 5

getp

EOFss

1 2 3 4 5

getp

EOFss

"12345"strNum

12345num

Page 14: CS 103 Unit 14 -Streams - USC Bitsbits.usc.edu/files/cs103/slides/Unit14_Streams.pdf · 3 Kinds of Streams •I/O streams –Keyboard (cin) and monitor (cout) •File streams –Contents

14

C++StringStream

• Canparseastringofmanyvaluesintoseparatevariables

#include<sstream>using namespace std;int main(){stringstream ss;ss << "2.0 35 a"

double x, int y; char z;ss >> x >> y >> z;

return 0;}

sstream_test3.cpp

getp

EOFss

2 . 0 3

getp

EOFss

getp

ss2.0x35y'a'z

5 a

2 . 0 3 EOF5 a

Page 15: CS 103 Unit 14 -Streams - USC Bitsbits.usc.edu/files/cs103/slides/Unit14_Streams.pdf · 3 Kinds of Streams •I/O streams –Keyboard (cin) and monitor (cout) •File streams –Contents

15

.str()

• str()memberfunctionwillreturnastringwiththecontentsofwhateverisinthestream

#include<sstream>using namespace std;int main(){stringstream ss;ss << 2.0 << " " << 35;ss << " " << 'a';

string s = ss.str();

return 0;}

sstream_test4.cpp

getp

EOFss

2 . 0 3

getp

EOFss

getp

ss"2.0 35 a"s

5 a

2 . 0 3 EOF5 a

Page 16: CS 103 Unit 14 -Streams - USC Bitsbits.usc.edu/files/cs103/slides/Unit14_Streams.pdf · 3 Kinds of Streams •I/O streams –Keyboard (cin) and monitor (cout) •File streams –Contents

16

C++StringStream

• Bewareofre-usingthesamestringstream objectformultipleconversions.Itcanbeweird.– Makesureyouclearitoutbetweenusesandre-init withanemptystring

• Orjustmakeanewstringstream eachtimestringstream ss;

//do something with ss

ss.clear();

ss.str("");

// now you can reuse ss

// or just declare another streamstringstream ss2;

Page 17: CS 103 Unit 14 -Streams - USC Bitsbits.usc.edu/files/cs103/slides/Unit14_Streams.pdf · 3 Kinds of Streams •I/O streams –Keyboard (cin) and monitor (cout) •File streams –Contents

17

Exercise

string text; int num; double val;

stringstream ss("Hello 103 2.0"); ss >> text >> num >> val;

• What'sineachvariableafterexecution?– text– num– val

Page 18: CS 103 Unit 14 -Streams - USC Bitsbits.usc.edu/files/cs103/slides/Unit14_Streams.pdf · 3 Kinds of Streams •I/O streams –Keyboard (cin) and monitor (cout) •File streams –Contents

18

Exercises• Inclassexercises

– Stringstream_in– Stringstream_out– Date

Page 19: CS 103 Unit 14 -Streams - USC Bitsbits.usc.edu/files/cs103/slides/Unit14_Streams.pdf · 3 Kinds of Streams •I/O streams –Keyboard (cin) and monitor (cout) •File streams –Contents

19

ChoicesWhereismy

data?

Keyboard(use_____)

File(use_____)

String(use______)

DoIknowhowmany?

Yes No

Page 20: CS 103 Unit 14 -Streams - USC Bitsbits.usc.edu/files/cs103/slides/Unit14_Streams.pdf · 3 Kinds of Streams •I/O streams –Keyboard (cin) and monitor (cout) •File streams –Contents

20

ChoicesIsit

delimited?

Text Integers/Doubles

Yes No

Whattypeofdata?

Page 21: CS 103 Unit 14 -Streams - USC Bitsbits.usc.edu/files/cs103/slides/Unit14_Streams.pdf · 3 Kinds of Streams •I/O streams –Keyboard (cin) and monitor (cout) •File streams –Contents

21

ChoosinganI/OStrategy• Ismydatadelimitedbyparticularcharacters?

– Yes,stoponnewlines:Usegetline()– Yes,stoponothercharacter:Usergetline()withoptional3rd character– No,Use>>toskipallwhitespacesandconverttoadifferentdatatype

(int,double,etc.)

• If"yes"above,doIneedtobreakdataintosmallerpieces(vs.justwantingonelargestring)– Yes,createastringstream andextractusing>>– No,justkeepthestringreturnedbygetline()

• Isthenumberofitemsyouneedtoreadknownasaconstantoravariablereadinearlier?– Yes,Usealoopandextract(>>)valuesplacingtheminarrayorvector– No,Loopwhileextractiondoesn'tfailplacingtheminvector

Remember:getline()alwaysgivestext/string.Toconverttoothertypesitiseasiesttouse>>

Page 22: CS 103 Unit 14 -Streams - USC Bitsbits.usc.edu/files/cs103/slides/Unit14_Streams.pdf · 3 Kinds of Streams •I/O streams –Keyboard (cin) and monitor (cout) •File streams –Contents

22

In-ClassExercises

• Wordcount

Page 23: CS 103 Unit 14 -Streams - USC Bitsbits.usc.edu/files/cs103/slides/Unit14_Streams.pdf · 3 Kinds of Streams •I/O streams –Keyboard (cin) and monitor (cout) •File streams –Contents

23

getline()andstringstreams• Imagineafilehasacertainformat

whereyouknowrelateddataisonasinglelineoftextbutaren'tsurehowmanydataitemswillbeonthatline

• Canweuse>>?– Noitdoesn'tdifferentiatebetween

differentwhitespace(i.e.a''anda'\n'lookthesameto>>anditwillskipoverthem)

• Wecanusegetline()togetthewholeline,thenastringstream with>>toparseoutthepieces

int num_lines = 0; int total_words = 0;

ifstream myfile(argv[1]);

string myline; while( getline(myfile, myline) ){

stringstream ss(myline);

string word;while( ss >> word ) { total_words++; }

num_lines++;}

double avg = (double) total_words / num_lines;

cout << "Avg. words per line: ";cout << avg << endl;

The fox jumped over the log.

The bear ate some honey.

The CS student solved a hard problem.

Page 24: CS 103 Unit 14 -Streams - USC Bitsbits.usc.edu/files/cs103/slides/Unit14_Streams.pdf · 3 Kinds of Streams •I/O streams –Keyboard (cin) and monitor (cout) •File streams –Contents

24

UsingDelimeters• Imagineafilehasacertainformat

whereyouknowrelateddataisonasinglelineoftextbutaren'tsurehowmanydataitemswillbeonthatline

• Canweuse>>?– Noitdoesn'tdifferentiatebetween

differentwhitespace(i.e.a''anda'\n'lookthesameto>>anditwillskipoverthem)

• Wecanusegetline()togetthewholeline,thenastringstream with>>toparseoutthepieces

vector<string> mywords;

ifstream myfile(argv[1]);

string myline; getline(myfile, myline, '(');// gets "garbage stuff "// and throws away '('

getline(myfile, myline, ')' );// gets "words I care about"// and throws away ')'`

stringstream ss(myline);string word;while( ss >> word ) {mywords.push_back(word);

}

garbage stuff (words I care about) junk

"words" "I" "care" "about"mywords

0 1 2 3

Text file: