CS 112 - Week 3 Lecture 2 - 2022-09-08 TODAY WE WILL * announcements * more C++ review/overview: * file input/output * arrays in C++ * if desired: * see Savitch Ch. 6 - more on interactive i/o and file i/o * see Savitch Ch. 7 - review of arrays ===== * intro to file input and file output in C++ * C++ has a library fstream that declares, amongst other things, some useful subclasses of classes from the iostream library for the purpose of reading from and writing to files (using a stream approach) * includes a class ifstream -- input file stream and a class ofstream -- output file stream * for reading from a file: * remember to: #include <fstream> * declare an ifstream object: ifstream in_stream; * to read from a file, you need to connect the ifstream object TO that file -- you can do that using the ifstream class' open method. * one version of open expects a string representing the file name (relative to the current working directory), and it attempts to attach that ifstream object TO that file for reading; in_stream.open("infile.txt"); * now this can be used similarly to how we use cin, to read from that file's characters: int data; string next_line; getline(in_stream, next_line); in_stream >> data; * and when you are done reading from the file, it is CS 112 CLASS STYLE to explicitly close the stream with the close method, which expects no arguments: in_stream.close(); * how about file output? * remember to: #include <fstream> * declare an ofstream object ofstream out_stream; * ofstream has more than one overloaded open method -- * if called with one string argument representing the name of a file relative to the current working directory, it tries to create that file if it does not exist, and opens that file, DELETING any of its current contents!!!!!!!!!!!!!!!!!!! * if called with TWO arguments, a string representing the name of a file relative to the current working directory, and a constant representing whether it should be opened for appending, ...for appending, this constant is the named constant app from the ios class, which you write using the SCOPE RESOLUTION OPERATOR :: as follows: ios::app ...and now you'll open for appending if it exists, and any writing will be done to the end of the file * now use this open ofstream to write to this file as you use cout to write to standard output: out_stream << "write me to file" << endl << (3 + 5) << endl; * and -- CS 112 CLASS STYLE -- explicitly close this output file stream when you are done with it, using its close method: outstream.close(); ====== review/overview of C++ arrays ====== * in C++, an array is one of the lowest-level built-in data structures * it is a collection of values (with one name) * its values are stored consecutively in memory * all of its values are of the SAME type * you must give its size when it is created * restrictive, but EFFICIENT! * first element has index 0 last element has index (size - 1) * array syntax to declare a statically-allocated LOCAL VARIABLE array: elem_type arr_name[num_of_elements]; Optionally, you can initialize it using curly braces: elem_type arr_name[num_of_elements] = {expr1, expr2, ... exprn}; * to access ONE element of an array, arr_name[desired_index] string words[5] = {"apple", "grape", "lemon", "cherry", "chocolate"}; cout << words[0] << endl; // prints apple cout << words[4] << endl; // prints chocolate words[2] = "lime"; // changed the 3rd element, // lemon, to lime for loops are LOVELY for arrays!!!! for (int i = 0; i < 5; i++) { cout << words[i] << endl; } for (string next_word: words) { cout << next_word << endl; } * can you have an array parameter in C++? YES -- C++ views the array (under the hood) as where it STARTS * an array parameter does NOT have a size indicated!!! (because it represents future array arguments, and each of those WILL have a size when they are declared...) ...and the array argument is passed as the address of where the array starts in memory...! ret_type arr_funct(..., arr_type arr_param[], int arr_size, ...) * note that to indicate an expected array in a function signature, we'll use the notation: ; signature: arr_funct: .... arr_type[] int ... -> ret_type