=====
CS 111 - Week 14 Lecture 2 - 2024-12-05
=====

=====
TODAY WE WILL:
=====
*   announcements
*   finish function get_smallest
*   intro file input/output
*   prep for next class

=====
*   should be wrapping up Homework 11!
    *   at-least-1st-attempts are due by 11:59 pm tomorrow,
        Friday, December 6

=====
intro to stream-based file input/output in C++
=====
*   we have been using the stream objects cin and cout
    from the C++ iostream library to do interactive input
    and screen output

*   C++ also has a library fstream to support stream-based
    file input/output

    SO, Step 1: to use this fstream library,
    #include it in the .cpp file whose function(s) use it!
    (before the using namespace std;)

    #include <fstream>

*   The iostream library could assume many users want
    standard input and output, and could declare and create
    the objects cin and cout accordingly

    BUT the fstream library can't know how many files you want
    to do things to/with -- you've got to declare your
    file stream objects yourself;

    *   IF you want to read FROM a file,
        (like cin reads from the keyboard/standard input),
        you declare an INPUT file stream object to connect to
	this file to do this input

	The type of this object: ifstream

        ifstream my_fin;

    *   IF you want to write TO a file,
        (like cout writes to the screen/standard output),
        you declare an OUTPUT file stream object to connect to
	this file to do this output

	The type of this object: ofstream

        ofstream my_fout;

    *   fstream objects (whether they are ifstream objects or
        ofstream objects) have a method open
	to connect the file stream TO a desired file,
	and to open that stream for the desired action

        One version of the open method expects one argument,
	a name of a desired file written as a string,
	(a full path or its name from the current folder)
	and it tries to connect the calling file stream to
	that file

        *   for an ifstream, calling open connects the ifstream
	    to that file so the stream is ready to read its
	    1st character:

            my_fin.open("desired_input.txt");

        *   for an ofstream, calling open creates a file with its
	    argument name if that file does not yet exist,
	    (and connects to the existing file and DELETES its
	    current contents if it does exist!!),
	    so the stream is ready to write its 1st character

            my_fout.open("desired_output.txt");
        
    *   ONCE you have an open ifstream,
        read from it like you read interactive input using cin!

        int quant;
	my_fin >> quant;

        ONCE you have an open ofstream,
	write to it like you write screen output using cout!

        my_fout << "Howdy" << endl;

    *   WHEN you are done with a file stream object,
        it is considered GOOD PRACTICE to close that file stream
	with its close method (which expects no arguments)

        my_fin.close();
	my_fout.close();

	(and you HAVE to do this if you wish to connect a different
	file stream to the same file later in your function,
	since a file can only have one file stream connected to it
	at a time)