Download - Dynamic(arrays,(separate( compila1on,(and(file(IO - PLG

Transcript

Dynamic(arrays,(separate(compila1on,(and(file(IO(

Supplementary(notes((

CS246(Fall(2012(Mike(Godfrey(

Dynamic(arrays(

•  We(now(discuss(“dynamic(arrays”(to(give(you(an(understanding(of(what(goes(on(“under(the(hood”(with(vectors(–  Dynamic(arrays(are(a(language'feature(of(C++,(meaning(that(the(

compiler(has(to(provide(special(support(for(them(–  The(vector(class(is(just(a(library(class(someone(wrote(for(you;(it(is(

implemented(in(straighOorward(C++(using(dynamic(arrays(

•  If(you(feel(like(you(need(a(dynamic(array(in(your(program,(you(should(almost(certainly(use(an(STL(vector instead(–  In(facts(there’s(not(much(need(to(use(any(kind(of(arrays(in(C++(since(

we(have(vectors,(plus(other(powerful(container(classes(in(the(STL.(

std::array [Not(on(exam]

•  The(new(C++(standard(from(2011,(known(as("C++11",(adds(a(new(library(class(called(std::array(–  Basically,(it's(a(nonZresizable(sta1callyZallocated(array,(like(a(CZarray,(

but(adds(other(vectorZlike(API(elements:(at(), size(),((…(–  About(as(efficient(as(a(CZarray,(but(with(some(added(safety:(at()

method,(disallows(some(kinds(of(unsafe(accesses(

•  Why(not(use(a(vector(instead?(–  std::array(is(slightly(more(efficient((–  If(the(array(is(declared(on(the(stack,(all(of(the(element(storage(is(also(

on(the(stack(–  Even(if(a(vector(is(declared(on(the(stack,(the(actual(storage(for(

elements(is(a(a(dynamic(array,(which(must(come(from(the(heap(

(Review)(Arrays**(

•  All(arrays(are(stored(in(con-guous(memory(i.e.,(element(k(is(stored(right(ager(element(kZ1(–  This(is(also(a(requirement(of(vector(and(std::array,(which(is(why(they(are(both(implemented(using(arrays(

•  This(allows(for(fast(random(access(of(any(element;(it's(address(is(a(quick(arithme1c(computa1on(–  If(A(is(an(array,(then((

•  A[0](is(stored(at(the(address(of(A •  A[k](is(stored(at(address(A(+(k(*(element_size(A)(

**From'this'point'on,'"array"'means'C9style'array'as'used'in'C++,'not'std::array'

(Review)(Arrays(

•  Can(think(of(A(as(just(being(a((const)(pointer(to(the(first(element(–  And(this(is(ogen(done(in(C/C++(programs(

e.g.,(CZstyle(strings(are(implemented(as(arrays(of(chars,(but(ogen(passed(to(procedures(as(a(char*

•  So(if(A(is(an(array(of(strings(or(Balloons,(we(can(think(of(A(as(being(a(pointer(to(a(string/Balloon –  As(long(as(we(remember(that(there(are(more(strings/Balloons(store(right(ager(it(in(memory(

–  But(A(must(always(point(to(that(storage,(can't(change(it(i.e.,(A(can(be(thought(of(as(being(of(type(const Balloon*

int main (int argc, char* argv[]) { const int N = 10; int A[N]; for (int i=0; i<N; i++) { A[i] = i*i; } int* p = A+6; // legal, means same as p = &A[6]; cout << "p points to " << *p << endl; p = A; // legal, means same as p = &A[0]; int* B = A; // legal, means same as B = &A[0]; // A = p; // illegal, as A is a const int* // Each of these is legal and prints same value for (int i=0; i<N; i++) { cout << "A[" << i << "] = " << A[i] << endl; cout << i << "[A] = " << i[A] << endl; cout << "B[" << i << "] = " << B[i] << endl; cout << "*(B+" << i << ") = " << *(B+i) << endl; cout << "*p = " << *p << endl; p++; // increment p to next element } }

C++(arrays(

1.  Sta1cally((•  Storage(is(allocated(on(the(stack((•  Array(bound(must(be(a(compileZ

1me(constant(•  Array(elements(are(store(in(

con1guous(memory!(

int main (…) { const int N = 5; int A[N]; // legal int m; cin << m; int B[m]; // illegal …

}

•  C++(arrays(can(be(declared(in(two(ways:(

Dynamic(arrays(

int main (…) { int N; cin >> N; int* A = new int[N]; string* B = myAlloc(N); for (int i=0; i<N; i++){ cin >> A[i] >> B[i]; } // … do more fun stuff delete [] A; delete [] B; }

2.  Dynamically((•  Declare(array(name(as(a(ptr(to(

element(type;(instan1ate(via(new •  Storage(is(allocated(on(the(heap(•  Array(bound(can(be(a(runZ1me(value(

(posi1ve(int)(•  Need(to(delete(when(done(

−  Don't(forget("[]"(

string* myAlloc (int n) { assert (n>0); return new string[n]; }

Dynamic(arrays(

•  Can't(return(an(array(from(a(procedure(–  But(arrays(are(almost(just(pointers((with(a(special(syntax(for(accessing(elements,(etc.)(

–  So(can(return(a(ptr(instead,(if(we(allocate(the(storage(on(the(heap(

Dynamic(arrays(

•  How(does("delete []A("(work?(–  The(system(needs(to(remember(the(extent(of(the(array:(i.e.,(the(#(of(elements(in(the(heapZchunk(that(were(allocated(for(the(dynamic(array(

–  The(array(extent(must(this(be(associated(somehow(with(the(block(of(storage(on(the(heap,(not(with(the(ptr((which(is(just(a(plain(old(ptr)((

(Q:(Why(not(store(the(extent(right(at(the(beginning(of(the(array?(

A:(That(would(break(normal(array(addressing(+(ptr(arithme1c(–  Common(approach(is(to(use,(eg,(4(bytes(before'the(array(storage(to(hold(

the(extent(–  So(this(means(that(the(following(works(fine(

string* myAlloc (int n) { assert (n>0); return new string[n]; } int main (int argc, char* argv[]) { string* A = myAlloc(10); string* B = myAlloc(20); // swap the pointers A and B string* temp = A; A = B; B = temp; // … and the deletes are no problemo, eh. delete []A; delete []B; }

Separate(compila1on(

•  Small(programs((<1000(LOC)(can(fit(into(one(file(easily(enough(1.  Edit(flurble.cc 2.  Compile:(g++ flurble.cc 3.  Run(a.out

•  But(for(large(programs((hundreds,(or(thousands(of(classes!),(it's(more(prac1cal(to(separate(out(pieces(of(your(code(into(dis1nct(compila-on'units'–  With(one(file,(you(have(to(recompile(everything(from(scratch(each(

1me(you(make(a(change(–  With(mul1ple(files,(you(have(to(recompile(only(the(bits(that(changed(

(plus(the(other(bits(that(depend(on(them)(–  For(big(systems,(this(is(a(huge(savings!((Even(with(separate(

compila1on,(building(very(large(industrial(systems(from(scratch(can(take(a(couple(of(days(

Separate(compila1on(

•  Our((fairly(standard)(approach(–  For(each(class(in(your(program,(call(it(Foo

•  Put(the(class(declara-on((interface)(into(a(file(named(Foo.h((including(a(guard:(#ifndef(__FOO_H__)(

•  Put(the(impls'of(Foo's(methods(into(a(file(named(Foo.cc •  Put(the(main(func1on(into(a(file(named(main.cc

–  Some(use(.cpp or(.C as(the(file(ending(

•  There(are(two(main(phases(to(building(a(system(–  Compile(each(of(the(compila1on(units((the(.cc files)(

g++ -c Foo.cc // produces a new file: Foo.o –  Link(the(object(files((.o files)(into(single(executable(

g++ -o myProgram *.o

// File: "Balloon.h" #ifndef __BALLOON_H__ #define __BALLOON_H__ #include <string> // library using namespace std; class Balloon { public: Balloon (string colour); void speak () const; private: string colour; }; #endif /* __BALLOON_H__ */

// File: "Balloon.cc" #include <iostream> #include <string> // <> => library #include "Balloon.h" // ""=>local file using namespace std; Balloon::Balloon (string colour) :

colour(colour) { } void Balloon::speak() const { cout << colour << " balloon" << endl; }

// File: "Child.h" #ifndef __CHILD_H__ #define __CHILD_H__ #include <string> #include "Balloon.h" using namespace std; class Child{ public: Child (string name, string bColour); virtual ~Child(); void speak() const; private: string name; Balloon* pb; }; #endif /* __CHILD_H__ */

// File: "Child.cc" #include <iostream> #include <string> #include "Child.h" using namespace std; Child::Child(string name, string bColour) : name(name), pb(new Balloon(bColour)) {} Child::~Child(){ delete pb; } void Child::speak() const { cout << "Child named " << name << " with a "; pb->speak(); }

// File: "main.cc" #include <iostream> #include <string> #include "Balloon.h" #include "Child.h" using namespace std; int main (int argc, char* argv[]) { Child ian ("Ian", "red"); Child trev ("Trevor", "green"); Child * ems = new Child("Emily", "yellow"); trev.speak(); ian.speak(); ems->speak(); }

Separate(compila1on(

•  Now(we(compile(each(.cc(file(g++ -c Foo.cc // produces Foo.o

•  We(don't(explicitly(compile(the(.h files,(or(the(library(files((e.g.,(string,(iostream)(directly;(they(get(included(by(the .cc files(that(need(to(see(them(

•  I(also(like(to(use(these(compiler(op1ons:(g++ -ansi –pedantic –Wall –c Foo.cc

g++ -c Foo.cc —(What(happens(

1.  First,(the(C/C++'preprocessor'runs,(performing(#include,(#define(and(checking(#ifdef(and(#ifndef –  This(transforms(the(exis1ng(source(code(to(new(source(code(–  Try(g++ -E Foo.c if(you(want(to(look(at(the(results(of(this(phase(for(fun(

2.  Then,(any(classes(defined(using(templates(are(created;(this(is(called(template'instan-a-on''e.g.,(vector<string>(is(created(from(generic(library(defini1on(vector<T> –  This(transforms(the(source(code(from(the(previous(step(to(an(some(internal(

representa1on((that(is(probably(not(easy(to(read,(depending(on(the(compiler)(

3.  Then,(the(results(of(the(above(are(transformed(into(an(object(file,(Foo.o –  The(whole(process(goes(something(like(this:(

Source'text'9>'tokens'9>'parse'tree'9>'[op-miza-on]'9>'object'code'–  You(will(learn(more(about(this(in(CS241;(it's(fascina1ng(stuff(

What(does(#include(mean?(

•  Each(.cc file(is((usually)(compiled(separately(–  It(has(to(be(able(to(see(a(declara1on(for(any(library(and(userZdefined(

type(/(class(that(it(uses,(so(it(must(include(the(appropriate(.h files(–  The((eventual)(.o file(leaves(an(empty("slot"(for(the(declared((but(

not(yet(defined)(types,(to(be(filled(in(when(all(of(the(.o(files(are(linked(together(during(the(final(stage(of(compila1on(

•  #include(is(simple(textual(inclusion!(–  The(whole(included(file(gets(sucked(up(into(the(current(file(before(

being(sent(to(the(compiler(–  Note(that(the(ifndef(guard(prevents(the(rest(of(the(file(from(being(

included(more(than(once(

What(to(#include

•  Each(.cc file(must(include(the(corresponding(.h(file,(using(quotes(–  Tho(there(is(usually(no(main.h(file(for(main.cc e.g.,(#include "Child.h" // in Child.cc

•  Each(.cc and(.h(file(must(include(all(of(the(library(en11es(that(it(references,(using(angle(brackets(e.g.,(#include <string>

•  Each(.cc and(.h file(must(include(the(.h(file(of(any(userZdefined(class(it(references,(using(quotes(e.g.,(#include "Ballon.h" // in Child.h, Child.cc, …

Balloon.h(

main.cc(Child.cc(Balloon.cc(

Child.h(

<string>(

C++(Std(Library(

<iostream>(

[All(five(source(files(above(include(these(library(files](

Who(includes(whom?(

#include

Compile(guard(ifndef

Problem:)Both(main.cc(and(Child.h(need(to(include Balloon.h,(and(main.cc(needs(to(include(Child.h

–  So(Balloon.h(will(be(included(twice(when(we(compile(main.cc –  Without(the(ifndef(guard,(the(compiler(will(complain(when(it(sees(

the(class(declara1on(for(Balloon(for(the(second(1me(

•  With(the(ifndef(guard,(the(first(1me(Balloon.h,(is(included,(the(variable(__BALLOON_H__(has(not(been(seen(before,(so(it(is(defined(–  The(second(1me(Balloon.h is(included,(the(variable(has(been(

defined(already,(so(the(class(declara1on(is(skipped(–  There(is(nothing(magical(about(the(name(__BALLOON_H__,(it's(just(

conven1on(

Next(step:(Linking(

•  Assume(each(foo.cc file(has(now(been(compiled(into(an(object(code((binary)(file(foo.o(–  Because(we've(included(the(.h files(for(each(method/type(we(need,(

the(compiler(has(basically(leg("slots"(open(for(each(.o(file(for(appropriately(named(en11es(to(be(filled(in(later(

–  Once(all(of(the(.o files(have(been(generated,(we(throw(them(into(one(big(box(called(a.out(and(hope(all(of(the(defini1ons(can(now(be(resolved( g++ *.o // creates executable a.out

–  So(Child.o(is(looking(for(the(Balloon(cxrs,(which(it(finds(in(Balloon.o,(and(main.o(is(looking(for(Child(cxr,(dxr,(and(Child::speak()

–  a.out(should(have(a(main(program(defined,(which(is(what(gets(executed(if(you(run(a.out(at(the(command(line(

Note(on(inclusion(

•  Note(that(technically,(main.cc(doesn't(have(to(include(Balloon.h,(string,(or(iostream,(as(it(includes(Child.h(which(already(includes(them(–  However,(it(is(a(bad(idea(to(rely(on(this;(it's(much(beter(for(each(file(

to(include(all(of((and(only)(the(files(that(it(uses(–  It(doesn't(cost(anything,(since(the(ifndef(guards(prevent(double(

copying(

•  At(the(same(1me,(do(not(get(into(the(habit(of(including(files(you(don't(use/need(–  It(can(cause(code(bloat(and(confusion(later(on(–  In(large(industrial(systems,(unnecessary(includes(can(greatly(slow(

down(system(builds(•  If(you(include(a(file(that(you(don't(need(to,(and(it(changes(a(lot,(you(get(recompiled(a(lot!(

Balloon.h(

main.cc(Child.cc(Balloon.cc(

Child.h(

<string>( C++(Std(Library(<iostream>(

[All(five(source(files(above(include(these(library(files](

Who(depends(on(whom?(

Balloon.o( Child.o( main.o(

a.out(

#include

g++ -c

g++ *.o

Compila1on(dependencies(mater(

•  Let's(suppose(you've(compiled(your(program(successfully(and(then(you(decide(to(make(changes(on(some(of(the(source(files(–  You(may(not(have(to(recompile(everything!(

•  If(file(A.cc(depends((transi1vely)(on(file(B.h(and(file(B.h(changes,(then(A.cc(needs(to(be(recompiled(–  And(then(the(executable(has(to(be(relinked(via(g++ *.o((

•  So(if(Balloon.h changes,(what(has(to(be(redone?(–  What(about(Balloon.cc?(

Compila1on(dependencies(mater(

•  Changing(a(major(design(decision(typically(means(changing(.h(files(–  And(this(usually(means(changing(all(of(the(files(that(include(the(

changed(.h(files(to(accommodate(the(new(design,(as(well(as(recompiling(them(

–  In(a(big(system,(changing(a(.h(file(ogen(is(disrup1ve(to(developers(

•  Fixing(a(bug(or(changing(an(implementa1on(strategy(ogen(involves(changing(only(.cc files,(which(means(less(rebuilding(

#include

•  If(you(use(quotes,(the(compiler(looks(in(the(current(directory: include "Balloon.h" include "gui/mainMenu.h"

•  If(you(use(angle(brackets,(it(looks(in(the(standard(library(loca1ons: include <vector> (

•  But(where(are(the(interface(files(for(standard(library(stored?(–  Well,(ogen(they're(in(a(subdirectory(of(/usr/include –  Unless(they(aren't(…(and(there(is(no(standard(way(of(asking(where(this(

loca1on(is(!(–  But(the(good(news(is(that(the(compiler(knows(where(to(find(them,(so(you(

don't(really(need(to(worry("(

–  If(you(want(to(know(what(the(full(API(for(vector(looks(like,(consult(the(web!(

And(how(are(the(implementa1ons((of(library(func1ons(found?(

•  Well,(for(separately(compiled(libraries((esp.(for(CZlanguage(libs),(once(again(the(compiler(magically(knows(where(to(find(them(and(how(to(link(them(to(your(program(–  You(might(look(in(/usr/lib,(but(that's(prety(advanced(stuff,(and(

different(compilers(may(do(things(differently(anyway(

•  For(C++(libraries(that(use(templates((vector,(string,(iostream,(etc.)(the(world(is(a(bit(different(…(((

And(how(are(the(implementa1ons((of(library(func1ons(found?(

•  For(various(technical(reasons,(classes(that(are(defined(using(C++(templates(must(be(fully(defined(inside(the(interface(file((i.e.,(there's(no(.h/.cc split(

•  So(if(you(include(vector,(string,(iostream,(etc.,(you(are(actually(including(quite(a(bit(of(source(code!((–  And(you(don't(know(what(vector,(etc.(themselves(might(include(

•  This(means(that(each(.cc(file(that(includes(vector(has(its(own(copy(of(the(source(code(for(vector(etc.(pulled(in(by(the(preprocessor(during(compila1on(–  When(you(link(the(.o(files(at(the(end,(the(compiler(is(clever(enough(to(

consolidate(duplicates(in(the(final(executable(

Automa1ng(builds(using(make

•  There(is(a(powerful((old)(Unix(command(line(tool(called(make(that(can(automate(the(build(recipes((–  make(is((fairly(smart(about(what(need(to(be(rebuilt(ager(changes(

occur(–  You(need(to(give(it(a(recipe(for(building(your(system(in(a(file(called(Makefile

–  We(will(cover(make(and(crea1ng(a(Makefile(later(

•  There(are(many(other,(newer(build(commandZline(tools(also,(such(as(ant,(maven,(SCons,(…(

•  If(you(use(an(IDE(like(Eclipse(or(VisualStudio,(it(will(also(automa1cally(track(what(needs(to(be(recompiled(ager(change(

FYI:(Building(Java(programs(

•  In(Java,(we(don't(separate(out(interface(from(implementa1on,(it(all(goes(into(one(big(.java(file(–  Usually,(we(put(one(major(class(in(each(.java file,(tho(some1mes(

we(bend(this(rule,(e.g.,(inner(classes(

•  There(is(no(preprocessor(or(template(instan1a1on(phase(–  No(#include,(no(#ifndef(guards,(no(#define(macros,(…(

•  Usually,(for(a(given(program(comprising(many(classes,(there(is(one(class(that(has(the("real"(main(program(in(it(–  But(any(class(can(have(its(own(main(program(too;(this(is(done(mainly(

to(allow(individual(classes(to(perform(tes1ng(

FYI:(Building(Java(programs(

•  A(Java(source(file,(call(it(Foo.java,(can(be(compiled(separately($ javac Foo.java –  …(but(this(will(automa1cally(trigger(the(compila1on((if(needed)(of(all(

other(classes(that(Foo(uses(or(depends(on(–  javac is(smart(about(not(recompiling(files(that(haven't(changed(

since(last(1me(

•  Separate(compila1on(produces(a(file(called(Foo.class –  If(Foo(has(a(main(func1on,(you(can(run(it(at(the(command(line:($ java Foo

•  You(can(also(package(up(a(set(of(class(files(into(a(single,(executable(jar(file(for(convenient(redistribu1on(

((Review)(Simple(I/O(

•  …(is(much(simpler(than(C((or(Java)(

•  #include<iostream> gets(you(three(useful(�streams�:((1.  cin (standard(input),(2.  cout (standard(output),(and((3.  cerr (output(stream(you(should(send(error(messages(to)(

•  Use(these(operators:(<< for(output(and(>>(for(input(–  They(have(been(overloaded(for(you(already(to(work(with(numbers,(chars,(and(strings(

–  You(can(overload(them(yourself(to(work(with(your(own(classes(

#include <iostream> #include <string> using namespace std; int main (int argc, char* argv[]){ cout « "Hello world" « endl; cout « "pi is approx. " « 22/double(7) « endl; string name; int age; cout « "What's you name and age? "; cin » name » age; if (age<0) { cerr « "Error, age must be non-negative.\n"; exit; } …

}

Output(formaxng(

•  There(are(many(output(formaxng(op1ons(you(can(set(too((e.g.,(field(width,(jus1fica1on,(...(you(can(read(up(on(this(

#include <iomanip> // need this! // ... for (...) { cout << left << setw(20) << prof.getName() << " " << right << setw(10) << prof.getSalary() << endl; }

(Review)(Input(white(space(

•  Note(that(cin » foo » bar;(grabs(the(next(two(tokens(in(the(input(stream,(skipping(all(intermediate(white(space.((

•  If(you(want(to(read(a(line(at(a(1me((with(white(space(intact),(do(this:((

string line; getline (cin, line);

–  You'll(have(to(parse(the(input(string(yourself(–  The(newline(char(is(removed(from(the(input(stream(but(NOT(stored(in(

the(variable(line –  getline(works(with(other(kinds(of(input(streams(too,(not(just(cin(

(Review)(Input(and(EOF(

•  To(check(for(EOF(gracefully,(see(if(cin.eof() or(cin.fail() returns(true:((–  eof() checks(for(only(EOF(–  fail() checks(for(EOF(plus(other(possible(problems.((

•  Both(eof()(and(fail()(can(be(used(with(other(input(streams,(not(just(cin.(

•  Note(that(eof()/fail()(don't(return(true(un1l(you've(actually(tried(to(go(one(step(too(far.((–  Therefore,(you(need(to(check(right(ager(an(atempted(read(but(before(

using(the(variable(you(tried(to(read(into.((

#include <iostream> using namespace std; int main (int argc, char* argv[]) { double sum = 0; int count = 0; while (true) { // awkward version double next; cin >> next; if (cin.fail()) { // or �if (!cin) {� break; // out of loop } sum += next; count++; } if (count > 0) { cout << "Avg is � << sum/count <<endl; } return 0; }

#include <iostream> using namespace std; int main (int argc, char* argv[]) { double sum = 0; int count = 0; double next; // "cin >> next" returns "cin" as a value, which in turn // returns "cin.fail()" when co-erced into a bool while (cin >> next) { sum += next; count++; } if (count > 0) { cout << "Avg of " << count << " numbers is � << sum/count << endl; } return 0; }

File(I/O(

•  There(are(library(classes(ifstream(and(ofstream(that(you(can(instan1ate(to(get(easy(fileZbased(IO(–  Need(this:(#include <fstream>

•  Can't(use(filename(directly(in(IO(stmt;(instead,(must(create(a(stream(object(and(associate(it(with(the(file(name((–  Nit:(Stream(cxrs(expects(file(name(to(be(a(char*,(not(a(string –  Need(to(check(that(the(stream(crea1on(was(successful(right(away(–  If(stream(crea1on(fails,((e.g.,(input(file(not(found,(don't(have(correct(

permission(to(write),(then(myin.fail()(will(return(true

•  Once(created,(we(can(use(<< or(>>(on(the(stream(object,(just(like(cin(and(cout

#include <iostream> #include <fstream> using namespace std; int main (int argc, char* argv[]) { if (argc <= 1 ) { cerr << "Error, must provide input file name.\n�; exit (1); } ifstream is_rawGrades (argv[1]); // argv[1] is a char* if (!is_rawGrades) { cerr << "Can't open input file " << argv[1] << endl; exit (1); } ofstream os_pass ("passes"); // explicit string value OK ofstream os_fail ("failures"); // Should also check os_pass and os_fail are valid …

int grade; string name; while (is_rawGrades >> grade >> name) { if (grade >= 50 ) { os_pass << grade << " " << name << endl; } else { os_fail << grade << " " << name << endl; } } is_rawGrades.close(); os_pass.close(); os_fail.close(); }

#include <string> #include <fstream> #include <iostream> using namespace std; int main (int argc, char* argv[]) { // This works: "input.txt" can be considered to // be a char* ifstream myInputFile ("input.txt"); // Won't work: inFileName is a string, not a char* string inFileName = "input.txt"; ifstream myOtherInputFile (inFileName); // error // This works: string is coerced into a char* ifstream myLastInputFile (inFileName.c_str()); … }

Opening(and(closing(file(IO(streams(

•  Can(either:((–  Connect(stream(to(a(file(name(in(the(cxr(call,(or((

ifstream myin ("input.txt"); –  Create(stream(on(its(own(+(connect(to(a(file(later(via(open

ofstream myout; myout.open("output.txt");

(•  Either(way,(we(need(to(close(all(of(our(streams(when(we(are(done(– We(can(open(it(up(again(connected(to(a(different(filename((

myout.close(); myout.open("output2.txt");

#include <iostream> #include <fstream> #include <string> using namespace std; int main (int argc, char* argv[]) { ifstream myin1; myin1.open("in1.txt"); ifstream myin2 ("in2.txt"); if (!myin1 || !myin2) { cerr << "Couldn't open an input file" << endl; exit (1); } ofstream myout; myout.open ("out1.txt"); if (!myout) { cerr << "Couldn't open output file" << endl; exit (1); }

string s; myin1 >> s; myout << s << " into file 1" << endl; myout.close(); myout.open("out2.txt"); if (!myout) { cerr << "Couldn't open myout " << endl; exit (1); } myout << s << " "; myin2 >> s; myout << s << " into file 2" << endl; myout.close(); myin1.close(); myin2.close(); }

What,(exactly,(are(cin,(cout,(cerr?((

•  cin,(cout,(and(cerr(are(just(plain(old(global(variables(that(are(defined(by(the(C++(Standard(Library,(and(are(available(to(any(C++(program(that(includes(iostream(–  cin(is(just(an(instance(of(the(C++(Standard(Library(class(istream –  cout,(cerr(are(instances(of(ostream

•  If(you(want(to(be(able(to(read/write(either(to(a(file(or'one(of(the(standard(input/output(streams,(then(you(can(use(the(library(types(istream(and(ostream –  ostream(is(a(more'general'class'than(ofstream(i.e.,(any(instance(of(ofstream(can(be(treated(as(if(it(were(an(instance(of(ostream(([An(analogous(situa1on(holds(for(ifstream/istream](

// Recall this example from slides on operator overloading #include <iostream> #include <fstream> #include <string> using namespace std; class Greeter { public : Greeter (string name, ostream & myout); void speak() const; private : string name; ostream& myout; // Was ofstream last time }; Greeter::Greeter (string name, ostream &myout) : name(name), myout(myout){} void Greeter::speak() const { myout << "Bienvenue a Mart-du-Mur!" << endl; myout << "Je m'appelle " << name << endl; }

int main (int argc, char* argv[]) { if (argc == 1) { cerr << "Usage: " << argv[0] << " outputFilename\n"; exit (1); } ofstream myoutfile (argv[1]()); if (!myout) { cerr << "Error, couldn't open output file " << argv[1] << endl; exit(1); } Greeter frank ("Frank", myoutfile); frank.speak(); Greeter alice ("Alice", cout); alice.speak(); myout.close(); }

Inheritance(and(polymorphism(

•  Note(that(cout((and(cerr)(are(instances(of(ostream(,(whereas(myoutfile(is(an(instance(of(ofstream((–  This(is(allowed(because(the(class((ofstream(inherits(from(the(class(ostream –  [Also,(ifstream(inherits(from(istream]((

•  If(A(and(B(are(classes(where(B(inherits(from(A,(then(any(instance(of(B(may(be(used(where(the(assumed(type(is(A(–  This(is(called(polymorphism'–  So(we(can(pass(in(myoutfile(which(is(an(instance(of(ofstream(to(a(

parameter(whose(type(is(the(more(general(ostream –  And(we(can(assign(the(reference(instance(variable(myout(of(type(ostream(to(

refer(to(an(object(of(type(ofstream((–  There(is(some(subtlety(here(about(how(polymorphism(works(with(objects(vs.(

references(vs.(ptrs(which(we(will(explore(in(the(next(sec1on;(usually,(we(use(ptrs!(

C++(I/O(libraries(

[Diagram(from(http://www.cplusplus.com/reference/iostream/](

File)to)be)included) Class) Object)

Arrow)between)classes)means)"is)inherited)by")("is)a)more)general)kind)of)en?ty)than"))

Dynamic(arrays,(separate(compila1on,(and(file(IO(

Supplementary(notes((

CS246(Fall(2012(Mike(Godfrey(