Streams and files - Michigan State Universitycse232/Weekly/week05/readings/8... · 2021. 1. 11. ·...

21
10/1/17 1 COMPUTER SCIENCE DEPARTMENT Streams and files COMPUTER SCIENCE DEPARTMENT more on streams

Transcript of Streams and files - Michigan State Universitycse232/Weekly/week05/readings/8... · 2021. 1. 11. ·...

  • 10/1/17

    1

    COMPUTER SCIENCE DEPARTMENT

    Streams and files

    COMPUTER SCIENCE DEPARTMENT

    more on streams

  • 10/1/17

    2

    COMPUTER SCIENCE DEPARTMENT

    streams, files, stringstreams

    IO Streams

    Monitor

    Executingprogram Keyboard

    Mouse

    ostream istream

    Output Device Input Device

    Streams are objects with names such as cin, cout, cerr.

    COMPUTER SCIENCE DEPARTMENT

    Each stream has an associated buffer, part of the stream object, that data is pulled/pushed from

    Buffer

    streams, files, stringstreams

  • 10/1/17

    3

    COMPUTER SCIENCE DEPARTMENT

    streams, files, stringstreams

    istream

    Executingprogram 18

    cin

    The >> (extraction) operator is an overloaded operator that takes values out of an input stream (cin), and stores them as the type indicated by the target variable.int my_var; cin >> my_var;The '1' is read, and then the '8' is read.Then the two characters are converted to the integer 18which is stored in variable my_var.

    COMPUTER SCIENCE DEPARTMENT

    When cin goes bad

    Executingprogram abc123…

    cin buffer

    int my_int=10; cin >> my_int; //

    a b c 1 2 3 …

    failtyped operator, can only readint type stuff, fails at the 'a'

    streams, files, stringstreams

  • 10/1/17

    4

    COMPUTER SCIENCE DEPARTMENT

    fail is fail, you must fix

    Executingprogram abc123 …

    cin buffer

    int my_int=10;char my_char='a';cin >> my_int; // failcin >> my_char;// fail

    a b c 1 2 3 …

    fail

    cin stays in failed state until you clean it up. All subsequentreads fail until that happens

    streams, files, stringstreams

    COMPUTER SCIENCE DEPARTMENT

    • Useful boolean member functions:cin.good(): all is well in the istream

    cin.bad(): something is wrong with istream

    cin.fail(): last op could not be completed

    cin.eof(): last op encountered end-of-file

    • Useful with the assert() function: e.g. assert(cin.good())

    streams, files, stringstreams

    Status Functions

  • 10/1/17

    5

    COMPUTER SCIENCE DEPARTMENT

    cin.clear()

    Executingprogram abc123 …

    cin buffer

    int my_intcin >> my_int; if(cin.fail())

    cin.clear();cin >> an_int;

    a b c 1 2 3 …

    goodclear clears the error,back to good, but notthe problem. Buffer isunchanged!!! Fails again.

    fail

    streams, files, stringstreams

    COMPUTER SCIENCE DEPARTMENT

    cin.ignore(num_chars_to_skip, stop_char)

    where num_chars_skip clears that number of chars from the buffer up to and including stop_char

    E.g. cin.ignore(20,'\n') skip 20 characters or until '\n' whichever comes first

    streams, files, stringstreams

    clear the buffer

  • 10/1/17

    6

    COMPUTER SCIENCE DEPARTMENT

    clear, then ignoreExecutingprogram empty

    cin buffer

    int my_int, an_int;cin >> my_int;if(cin.fail()){

    cin.clear();cin.ignore(1000, '\n');

    }// reprompt, try again

    goodignore empties thebuffer. Now you cantry again (repromptfor example).

    empty buffer

    streams, files, stringstreams

    COMPUTER SCIENCE DEPARTMENT

    • takes a default count as 1• any number works• numeric_limits::max()

    (requires #include) means as many as necessary to hit the stop char.

    • takes a default stop as the eof char

    more on ignore

    streams, files, stringstreams

  • 10/1/17

    7

    COMPUTER SCIENCE DEPARTMENT

    The situation is more complicated for numbers. For example, try reading a float into an integer.

    more complicated for a float

    streams, files, stringstreams

    COMPUTER SCIENCE DEPARTMENT

    When cin goes bad

    Executingprogram 18.123…

    cin buffer

    int my_int; cin >> my_int; //18

    1 8 . 1 2 3 …

    not a failure, more likea separator

    typed operator, can only readint type stuff, stops (not fails) at the '.'

    streams, files, stringstreams

  • 10/1/17

    8

    COMPUTER SCIENCE DEPARTMENT

    When cin goes bad

    Executingprogram 18.123…

    cin buffer

    int my_int, an_int; cin >> my_int; //18 cin >> an_int;

    1 8 . 1 2 3 …

    fail

    next read is a failure (chokes on the '.')

    streams, files, stringstreams

    COMPUTER SCIENCE DEPARTMENT

    When cin goes bad

    Executingprogram 18\n hi\n

    cin buffer

    int my_int, an_int; cin >> my_int; //18 cin >> an_int;

    1 8 \n h i \n …

    fail

    next read is a failure (chokes on the '.')

    streams, files, stringstreams

  • 10/1/17

    9

    COMPUTER SCIENCE DEPARTMENT

    We'll see it is easier to treat this as a string and try to cast it.

    Better to treat as a string and cast

    streams, files, stringstreams

    COMPUTER SCIENCE DEPARTMENT

    cin >> some_var returns:

    • cin if things go well• false if you hit eof• false if the stream is in a fail or bad mode

    Thus you can:while(cin >> some_var)

    cin returns ?

    streams, files, stringstreams

  • 10/1/17

    10

    COMPUTER SCIENCE DEPARTMENT

    • White space: blanks, tabs, and returns• By default, the >> operator skips

    leading white space• int X, Y, Z; • cin >> X >> Y >> Z;• Input: 3 4 5X is 3, Y is 4, Z is 5

    streams, files, stringstreams

    White space

    COMPUTER SCIENCE DEPARTMENT

    • Turn off skipping white space: • cin >>noskipws

    • Turn skipping white space back on: • cin >> skipws

    • ALTERNATIVE: use an input function which does not skip white space: cin.get(ch) reads exactly one character no matter the character

    streams, files, stringstreams

    Controlling White Space

  • 10/1/17

    11

    COMPUTER SCIENCE DEPARTMENT

    • To read a single character, not skipping:• cin.get(ch)

    • To put that character back into the buffer• cin.putback(ch)

    • To peek without removing it:• cin.peek()

    streams, files, stringstreams

    Single Character

    COMPUTER SCIENCE DEPARTMENT

    • Single character function: cout.put(ch) puts a single character into the ostream.

    streams, files, stringstreams

    Output functions

  • 10/1/17

    12

    COMPUTER SCIENCE DEPARTMENT

    streams, files, stringstreams

    ostream

    Monitor

    Executingprogram

    ostream

    Output Device

    COMPUTER SCIENCE DEPARTMENT

    streams, files, stringstreams

    cout and cerr

    Monitor

    Executingprogram

    Output Device

    cout

    cerr

    Cout and cerr are particular instances of an ostream.

  • 10/1/17

    13

    COMPUTER SCIENCE DEPARTMENT

    streams, files, stringstreams

  • 10/1/17

    14

    COMPUTER SCIENCE DEPARTMENT

    • Output characters are stored into a buffer before being output, i.e. gather up a bunch of characters before sending them to the screen. This can be a problem for debugging: output may be in the buffer leading you to believe that an error occurred before the output statement when it actually occurred afterward.

    streams, files, stringstreams

    Buffer

    COMPUTER SCIENCE DEPARTMENT

    double f(double X){cout

  • 10/1/17

    15

    COMPUTER SCIENCE DEPARTMENT

    double f(double X){cout

  • 10/1/17

    16

    COMPUTER SCIENCE DEPARTMENT

    • Files are collections of data and are stored in nonvolatile memory, e.g. secondary storage such as disk.

    • Text Files store characters such as ASCII, e.g. source code.

    • Binary Files contain non-ASCII characters, e.g. compiled code.

    • Humans can read text files.

    streams, files, stringstreams

    Files

    COMPUTER SCIENCE DEPARTMENT

    streams, files, stringstreams

    Stream Review

    Monitor

    Executingprogram Keyboard

    Mouse

    ostream istream

    Output Device Input Device

    Streams are objects with names such as cin, cout, cerr.

  • 10/1/17

    17

    COMPUTER SCIENCE DEPARTMENT

    streams, files, stringstreams

    File Streams

    Executingprogram

    ofstream ifstream

    Output Input

    Previous streams were objects with names such as cin, cout, cerr.Now we add streams which are files. We can name them.

    File (on disk)File (on disk)

    COMPUTER SCIENCE DEPARTMENT

    Because we are working with the stream object, the pipe, we do not have to worry about particular devices (that is the software's problem).

    Result is that many of the operations we used with cin and cout work with files.

    just another stream

    streams, files, stringstreams

  • 10/1/17

    18

    COMPUTER SCIENCE DEPARTMENT

    • required #include. This provides two kinds:• ifstream (input files)• ofstream (output files)

    • Can establish a connection by:• declare with the name (as a string) to open

    automatically• .open(string) method to establish

    connection between a program and a file.

    streams, files, stringstreams

    to work with a file

    COMPUTER SCIENCE DEPARTMENT

    #include// automatically open in_file

    ifstream in_file("my_file.txt");

    ofstream out_file;

    string file_name;

    cin >> file_name;

    // out_file created and now openedout_file.open(file_name);

    example

    streams, files, stringstreams

  • 10/1/17

    19

    COMPUTER SCIENCE DEPARTMENT

    When you open a file with a simple name, like "file.txt", the assumption is that the file is located in the same director/folder as the executing program.

    If not there, you have to give a fully qualified path.

    Where is that file?

    streams, files, stringstreams

    COMPUTER SCIENCE DEPARTMENT

    Sadly, this can depend on the underlying operating system:

    • C:\Documents\My Folder\file.txt• /usr/local/bill/file.txt

    Know that it is true and assume the file is in the correct place

    fully qualified path

    streams, files, stringstreams

  • 10/1/17

    20

    COMPUTER SCIENCE DEPARTMENT

    • >>,

  • 10/1/17

    21

    COMPUTER SCIENCE DEPARTMENT

    other file modes

    for input files, thedefault is input

    for output files, thedefault is open andtrunc. Thus outfiles, by default, wipeout any info in thefile being written to

    streams, files, stringstreams

    COMPUTER SCIENCE DEPARTMENT

    If you declare a file as an fstream, you get to decide what aspects you want.

    fstream in_out_file ("file.txt", fstream::in | fstream::out | fstream::ate);

    This a file one can read from and write to, and writing occurs at the end of the file.

    specify yourself

    vertical bars are bitwise or operator,look it up. We combine all aspects this way

    streams, files, stringstreams