__FUNCTION__
is a C++ preprocessor macro // file firstIO.cpp // basic input and output streams #include <iostream> #include <fstream> using namespace std; // ================== // // ================== // void printSomething(ofstream &localIOstream) // passing arguments by reference { localIOstream << "\n"; localIOstream << "printing something from the function \""; localIOstream << __FUNCTION__ << "\"\n"; } // ================== // // ================== // int main () { ofstream myIOstream; // declare output file stream myIOstream.open ("example.txt"); // open output stream myIOstream myIOstream << "Writing a line with an escape character (\\n) \n"; myIOstream << "for line breaks" << endl; printSomething(myIOstream); myIOstream.close(); // return 0; }
ofstream
, ifstream
are output/input file streamsfstream
is bi-directionalgetline()
for reading line by lineis_open()
check, whether the file
has really been openedgnuplot
for a quick look
to the data in test.dat#include <iostream> // standard IO #include <fstream> // file streams #include <math.h> using namespace std; void printData(ofstream &myStream, string outputString) // by reference { myStream << "# (printData): " + outputString; double radius, phi, x, y; for (int i=1;i<100;i++) { phi = i*M_PI*4.00/100.0; radius = 1.0 + i*2.0/100.0; // linear spiral x = radius*cos(phi); y = radius*sin(phi); myStream << x << " " << y << endl; } } int main () { ofstream myOutput; myOutput.open("test.dat",ios::out); myOutput.setf(ios::fixed,ios::floatfield); // for formated output myOutput.precision(2); // floating point precision myOutput << "# the hashtag is for comments in data files\n"; // printData(myOutput, "data output should bed done in the respective utilities\n"); // myOutput.close(); // string line; ifstream myInput ("test.dat"); if (myInput.is_open()) // found and opened? { while ( getline(myInput,line) ) cout << line << '\n'; myInput.close(); } else cout << "(main) unable to open file\n"; // return 1; }
# nSites = 100 xL = 10 dimension = 2 # nBonds = 200 yL = 10 maxMCsteps = 20000 # # ============================================== # temp, ener, d(ener), c_V, d(c_V), auto-tau, #measures, L 0.300 -0.662047 0.000948 0.009605 0.070852 1.288341 19888 524 0.400 -0.641439 0.001178 0.321162 0.060566 1.528553 19679 401 0.500 -0.598160 0.001361 0.411017 0.044197 1.325427 19756 334comments to be skipped when reading data files
.open()
takes C-type strings obtained
via .c_str()
#include <iostream> // standard IO #include <fstream> // file streams #include <sstream> // string streams #include <stdio.h> // printf #include <math.h> using namespace std; void generateData(string fileName) { ofstream myStream; myStream.open(fileName.c_str(),ios::out); myStream.setf(ios::fixed,ios::floatfield); // for formated output myStream.precision(4); // alternatively use sprintf() myStream << "# a quadratic spiral\n"; myStream << "# x y\n"; // double radius, phi, x, y; int nData = 500; for (int i=1;i<nData;i++) { phi = i*M_PI*6.00/nData; radius = 0.1 + i*i*2.0/(nData*nData); // quadratic spiral x = radius*cos(phi); y = radius*sin(phi); myStream << x << " " << y << endl; } } int main() { string fileName = "test.dat"; generateData(fileName); // // --- string stream example // int aaa, bbb; stringstream ss; ss << 100 << ' ' << 200; // streaming to ss ss >> aaa >> bbb; // streaming from ss // printf("\n"); printf("aaa: %d and bbb: %d\n",aaa,bbb); printf("\n\n"); // // --- extracting numbers via string stream // string line; ifstream myInput(fileName.c_str()); // input file stream if (myInput.is_open()) // found and opened? { while ( getline(myInput,line) ) { istringstream inputSS(line); // line loaded in buffer double a, b; if (inputSS >> a >> b) // line containing two numbers? printf("(main) %6.3f %6.3f\n",a,b); else cout << line << '\n'; } myInput.close(); } else cout << "(main) unable to open file\n"; // return 1; }
char c = cin.peek();
putback()
char c = cin.ignore(8,'\n');
myInputStream.eof()
: boolean function
returning true when end of file encountered
myInputStream.fail()
: last reading failed;generateData(fileName);
and
corrupting test.dat
#include <iostream> // standard IO #include <fstream> // file streams #include <limits.h> // INT_MAX, etc #include <stdio.h> // printf #include <stdlib.h> // srand, rand using namespace std; /* *** ************ *** */ /* *** generateData *** */ /* *** ************ *** */ void generateData(string fileName) { ofstream myStream; myStream.open(fileName.c_str(),ios::out); myStream.setf(ios::fixed,ios::floatfield); // for formated output myStream.precision(4); // alternatively use sprintf() myStream << "# a 2D random walk\n"; myStream << "# x y\n"; // int nData = 150; double probability, x=0, y=0; // for (int i=1;i<nData;i++) { myStream << x << " " << y << endl; probability = rand()/(double)RAND_MAX; x += probability-0.5; probability = rand()/(double)RAND_MAX; y += probability-0.5; } } /* *** **** *** */ /* *** main *** */ /* *** **** *** */ int main() { srand(time(NULL)); // Initialize once at program startup. string fileName = "test.dat"; generateData(fileName); // // --- extracting numbers directly // string line; const char commentChar = '#'; ifstream myInput(fileName.c_str()); // input file stream char inChar = myInput.peek(); // peak first char of file while (inChar==commentChar) // skipping comments { myInput.ignore(INT_MAX, '\n'); // skip to next line inChar = myInput.peek(); // peak first char of line printf("# ignoring a line with comments\n"); } // double xValue, yValue; while ( !myInput.eof() ) // reading until end of file { static int nData = 0; // counter nData++; myInput >> xValue >> yValue; // (*) if (myInput.fail()&&(!myInput.eof()) ) // check if (*) was successfull { printf("\n# reading from --%s-- failed due to corrupted data\n",fileName.c_str()); break; } cout << " " << nData; } cout << endl; myInput.close(); // return 1; }
cout << endl;
: endl
is an IO manipulator
cout << setw(10) << setprecision(3) << 3.33 << endl; printf("%10.3f\n",3.33); // (nearly) equivalent cout.setw(10); // alternative cout.setprecision(3); // explicit function call
>>
#include <iostream> // standard IO #include <fstream> // file streams #include <sstream> // string streams #include <stdio.h> // printf #include <iomanip> // IO manipulations using namespace std; int main() { // // --- using the extraction operator // char ch = 'a'; cout << endl; cout << "please enter something" << endl; cout << "stop with zero " << endl; while ( (cin >> ch)&&(ch!='0')) cout << ch << endl; cout << endl; // // --- using setw() // char buf[3]; cout << "now, please enter something long" << endl; while ( (cin >> setw(3) >> buf)&&(buf[0]!='0')) { // note: C style strings require a null terminator string strBuf(buf); // using string constructor for char* to string conversion cout << strBuf << endl; } cout << endl; // return 1; }
seekg()
: seek get
fileObject.seekg( n ); // to nth position (assumes ios::beg; default) fileObject.seekg( n, ios::cur ); // move n postions forward fileObject.seekg( n, ios::end ); // nth postions back from end fileObject.seekg( 0, ios::end ); // right to the end
seekp()
: seek put can be used for a
random access to files
tellg()
/ tellp()
return current reading / writing position in stream #include <iostream> // standard IO #include <fstream> // file streams using namespace std; int main() { char str[10]; ofstream a_file("test.dat"); // // === create 8 x 8 playing field // for (int i=0;i<8;i++) { a_file << (char)(97+i) << 0; for (int j=1;j<8;j++) a_file << " " << (char)(97+i) << j; a_file << endl; cout << a_file.tellp() << " "; } cout << endl; // // === change entries of field // for (int i=0;i<7;i++) { long writeHere = 24*i + 3*(i+1); // line is 24 char long a_file.seekp(writeHere, ios::beg); // advance put postion from file start a_file << "@@"; } // // === close file // a_file.close(); return 1; }
cout << myType;
can implemented for any
user defined type (classes); not down here
#include <iostream> // standard IO #include <stdio.h> // printf() #include <assert.h> // assert() using namespace std; template <size_t size> class A_Buffer { private: int pos; // for insertion, retriving at (pos-1) int data[size]; public: bool isEmpty,isFull,outError,inError; A_Buffer<size>() // standard constructor { pos=0; assert(size>0); // buffer should exsist isEmpty = true; isFull = false; inError = false; // when trying to add to full buffer outError = false; // when trying ro retivve from empty buffer // alternatively, throw exception for (int i=0;i<size;i++) // not really needed data[i] = 0; } A_Buffer<size>& operator>>(int &outInt) // like cin >> variable { if (pos>0) { pos--; outError = false; outInt = data[pos]; if (pos==0) isEmpty = true; } else { outError = true; outInt = -1111; } isFull = false; return *this; } A_Buffer<size>& operator<<(int newInt) // like cout << variable { if (!isFull) { data[pos] = newInt; isEmpty = false; inError = false; pos++; } else inError = true; // if (pos==size) isFull = true; return *this; } }; int main() { A_Buffer<2> testBuff; // a buffer for up-to 10 integers int testInt = 0; // // testBuff >> testInt; // nothing is in the buffer cout << " isEmpty/Full : " << testBuff.isEmpty << " " << testBuff.isFull << endl; cout << " in/outError : " << testBuff.inError << " " << testBuff.outError << endl; printf("content of buffer: "); while (!testBuff.isEmpty) { testBuff >> testInt; printf("%4d",testInt); } printf("\n"); // testBuff << 5; testBuff << 7 << 9; cout << " isEmpty/Full : " << testBuff.isEmpty << " " << testBuff.isFull << endl; cout << " in/outError : " << testBuff.inError << " " << testBuff.outError << endl; printf("content of buffer: "); while (!testBuff.isEmpty) { testBuff >> testInt; printf("%4d",testInt); } printf("\n"); // return 1; }
sprintf()
to convert numbers to string (char array) #include <iostream> // std IO #include <stdio.h> // printf() #include <math.h> // abs() #include <stdlib.h> // exit() using namespace std; // --- -------------------- // --- console canvas class // --- -------------------- class Canvas { private: static const int nColors = 6; string forwardColors[6], backwardColors[6]; // ANSI colors int dimX, dimY; // dimensions of drawing panel int x, y; // current cursor position; public: Canvas() // overwriting the default constructor { cout << "(Canvas): wrong constructor\n"; exit(EXIT_FAILURE); // exit(0) for success } Canvas(int dimX, int dimY) // regular constructor (to be used) { this->dimX = dimX; this->dimY = dimY; forwardColors[0] = "\x1b[30m"; backwardColors[0] = "\x1b[40m"; // black forwardColors[1] = "\x1b[31m"; backwardColors[1] = "\x1b[41m"; // red forwardColors[2] = "\x1b[32m"; backwardColors[2] = "\x1b[42m"; // green forwardColors[3] = "\x1b[33m"; backwardColors[3] = "\x1b[43m"; // yellow forwardColors[4] = "\x1b[34m"; backwardColors[4] = "\x1b[44m"; // blue forwardColors[5] = "\x1b[37m"; backwardColors[5] = "\x1b[47m"; // white x = 0; y = 0; } void moveCursor(int deltaX, int deltaY) { static const string first("\x1b["); static const string plusY("A"); static const string minusY("B"); static const string plusX("C"); static const string minusX("D"); char strDeltaX[50]; char strDeltaY[50]; string escapeCharX, escapeCharY; sprintf(strDeltaX, "%d",(deltaX>0)?deltaX:(-deltaX)); // write to string sprintf(strDeltaY, "%d",(deltaY>0)?deltaY:(-deltaY)); // if (deltaX>0) escapeCharX = first + strDeltaX + plusX; else escapeCharX = first + strDeltaX + minusX; // if (deltaY>0) escapeCharY = first + strDeltaY + plusY; else escapeCharY = first + strDeltaY + minusY; // if (deltaX!=0) cout << escapeCharX; // stream control sequence if (deltaY!=0) cout << escapeCharY; x = x + deltaX; y = y + deltaY; } void clearCanvas() { moveCursor(-x,dimY-y); for (int i=0;i<dimY;i++) { for (int j=0;j<dimX;j++) { cout << " "; x++; } moveCursor(-x,-1); } } void drawBorder() { moveCursor(-x,dimY-y); cout << backwardColors[4]; for (int j=0;j<dimX;j++) { cout << " "; x++; } for (int i=1;i<dimY;i++) { moveCursor(-1,-1); cout << " "; x++;} // moveCursor(-x,dimY-y); for (int i=1;i<dimY;i++) { cout << " "; x++; moveCursor(-1,-1);} for (int j=0;j<dimX;j++) { cout << " "; x++; } // cout << "\x1b[0m"; // clear all formatting, if any } void colorText(string text, int color, int xPos, int yPos) { moveCursor(-x,-y); // got to lower left corner moveCursor(xPos,yPos); // writing here cout << forwardColors[color]; cout << text ; x += text.length(); cout << "\x1b[0m"; // clear all formatting, if any } }; // end of Canvas class // --- ---- // --- main // --- ---- int main() { cout << " "; // Canvas *myCanvas = new Canvas(40,20); myCanvas->clearCanvas(); myCanvas->drawBorder(); myCanvas->colorText("this is a canvas,",1,5,13); myCanvas->colorText("which can be used for",2,5,11); myCanvas->colorText("simple animations",3,5,9); myCanvas->colorText(" ",0,0,0); // goto orgin cout << "\x1b[0m"; // clear all formatting, if any return 0; }