[This page was removed from the UMich site but I found it cached at google.com Now you're looking at a local NU CCS copy Search for String Streams in the document below -- RP Futrelle] Introduction to I/O Statements October 25, 2000 Horstman Ch. 10 Output Declare the file variable for the output ofstream outputData; where ofstream is the file variable for output and outputData is the object for the file. The same command for input files will open the output file. outputData.open(“output.dat”); Writing to a file is just like writing to the screen. Instead of cout we now use the object name of the file. int x; cout << x; outputData << x; Example #include <iostream> #include <fstream> #include <vector> using namespace std; void fillVector(vector<double>& v,double dValue,int& i) { //function will move a number into the vector v[i] = dValue; } int printVector(vector<double>& o) { //declare file variable for output ofstream outputData; double sum = 0, average = 0; //open file to write to outputData.open("output.txt"); //validate file has opened if (outputData.fail()) { //program could not open file cout << "Unable to Open output File\n"; //end program return 1; } //function will print vector contents to an output file // and calculate the average for (int i = 0; i < o.size(); i = i + 1) { sum = sum + o[i]; outputData << "Student "<< i+1 << " scored a " << o[i] << "\n"; } average = sum/i; outputData << "The average score is " << average << "\n"; //close up file outputData.close(); return 0; } int main(void) { //declare variable for input file ifstream inputData; //declare vector to hold data int iVectorLength = 10; vector<double> a(iVectorLength); //open input file inputData.open("input2.txt"); //validate file has opened if (inputData.fail()) { //program could not open file cout << "Unable to Open File\n"; //end program return 1; } double dTestScore; int iRecNum = 0; while (!inputData.fail()) { //read the first number from the file inputData >> dTestScore; // call function to fill vector with data fillVector(a,dTestScore,iRecNum); iRecNum = iRecNum + 1; } //call function to write results to the screen int ret = printVector(a); if (ret > 0) { cout << "Program failed to write to file\n"; } //close up file inputData.close(); return 0; } Single characters can be written with the put method. char ch = ‘A’; inputData.put(ch); Input/Output Declare the file variable for input/output fstream fileData; where fstream is the file variable for input/output and fileData is the object for the file. The same command for input files will open the input/output file. fileData.open(“file.dat”); String Streams Other stream classes can be used to read characters from a different source or to send them to a different destination. The istringstream class reads characters from a string and the ostringstream class writes characters to a string. Using istringstream you can read numbers that are stored in a string. String streams require the sstream library. #include <sstream> Example from Horstman: string input = “January 23, 1955”; istringstream instr(input); Now, use the >> to break the string into pieces string month, comma; int day, year; instr >> month >> day >> comma >> year; Conversely, by writing to a string stream, you can convert numbers to strings. Construct an ostringstream object: ostringsteam outstr; Now, use the << operator to add a number to the string stream outstr << 5.3; To obtain the string from the stream call the member function str(). outstr.str(); Consider the creation of a string summarizing average score for the class on exam number one. string text1 = “The class scored an average of “; double average = 85.9; int examNumber = 1; string text2 = “on Exam number “; outstr << text1 << average << text2 << examNumber; string sOutput = outstr.str(); String sOutput is now equal to the string “ The class scored an average of 85.9 on Exam number 1” Command Line Arguments When you invoke your programs from the command line (which you have been doing for weeks), you can also type in additional information for use by your program. These are commonly referred to as command line arguments. For example instead of starting the program at the prompt by calling just the name prompt% example.exe We can add additional information to the command. prompt% example.exe text.txt where text.txt is an input file name. This technique is very useful in eliminating “hard codes” of file names and other “volatile” variables. For your program to understand command line variables the main function must be changed to receive arguments. The main will receive the following two arguments: int argc where arc is the count of arguments char* argv[] where argv denotes an array of pointers to C character arrays int main (int argc, char* argv[]) { … } Note in our example argv[0] is example.exe argv[1] is text.txt Another Example … #include <iostream> #include <fstream> #include <string> using namespace std; int main(int argc,char* argv[]) { //declare variable for input file //read file name from screen string sFileName; if (argc ==2) { sFileName = string(argv[1]); cout << "The file entered is: " << sFileName << "\n"; } else { cout << "Please enter file name after program name \n"; return 1; } ifstream inputData; //open input file inputData.open(argv[1]); //validate file has opened if (inputData.fail()) { //program could not open file cout << "Unable to Open File\n"; //end program return 1; } int iTestScore; //read the first number from the file inputData >> iTestScore; //write the results to the screen cout << "The Student Scored a " << iTestScore << "\n"; return 0; }