Presentation is loading. Please wait.

Presentation is loading. Please wait.

2008YeungNam Univ. SE Lab. 1 C++ views each file as a sequence of bytes terminated by EOF-marker. Header files Files are opened by creating objects of.

Similar presentations


Presentation on theme: "2008YeungNam Univ. SE Lab. 1 C++ views each file as a sequence of bytes terminated by EOF-marker. Header files Files are opened by creating objects of."— Presentation transcript:

1 2008YeungNam Univ. SE Lab. 1 C++ views each file as a sequence of bytes terminated by EOF-marker. Header files Files are opened by creating objects of these stream template specializations. A 9. File Processing 0001 Jane 123.50 0023 Gloria -31.24 0035 Doe 89.00 accnt name balance 0023 Gloria-31.24 record Gloria field G byte 01000111 0 bit file Data Hierarchy data base 0 struct or class in C++ and must be included.

2 2008YeungNam Univ. SE Lab. #include using std::cout; using std::cin; using std::ios; #include using std::ofstream; struct Client { int a; // account char n[20]; // name double b; // balance }; int main() { ofstream osf("C:\\client.txt", ios::out); if ( !osf ) return 1; Client c; cout << "Enter account name balance:\n? "; while ( cin >> c.a >> c.n >> c.b ) { osf<<c.a<<' '<<c.n<<' '<<c.b<<'\n'; cout << "? "; } osf.close(); // optional return 0; } csf.cpp 2  C++ imposes no structure, such as “record”, on a file. Creating a Sequential File File I/O “ lpt1: ” for printer default path: Current project’s path Open mode ); Default open mode for ofstream 9. File Processing A ofstream osf; osf.open("C:\\client.txt"); Enter account name balance: ? 0001 Jane 123.50 ? 0023 Gloria -31.24 ? 0035 Doe 89.00^z ^z

3 2008YeungNam Univ. SE Lab. 3 File Open Modes File I/O opens a file for binary input or output ios::binary discards the file’s contents if it exist. This is the default action for ios::out ios::trunc opens a file for output ios::out opens a file for input ios::in opens a file for output and move to the end of the file. Data can be written anywhere in the file. ios::ate writes all output to the end of file. ios::app DescriptionMode 9. File Processing A

4 2008YeungNam Univ. SE Lab. 4 Reading a Sequential File File I/O void putClient( const Client& c ) { static int title = 1; if ( title && title-- ) cout << "Acnt...Name.......Balance\n" << setiosflags(ios::fixed|ios::showpoint); cout<< setw(4) << right << setfill('0') << c.a << ' ' << setw(13) << left << setfill(' ') << c.n << setw(7) << right << setprecision(2)<< c.b <<'\n'; } int main( ) { ifstream isf; isf.open( "C:\\client.txt", ios::in ); if ( !isf ) { cerr << "Open failed...\n"; return 1; } Client c; while ( isf >> c.a >> c.n >> c.b ) putClient( c ); return 0; } #include using std::cout; using std::cin; using std::cerr; using std::ios; #include using std::ifstream; #include using std::setiosflags; using std::setprecision; using std::setw; using std::setfill; using std::left; using std::right; struct Client { int a; char n[20]; double b; }; 9. File Processing A rsf.cpp Acnt...Name.......Balanc e 0001 Jane 123.50 0023 Gloria - 31.24 0035 Doe 89.00

5 2008YeungNam Univ. SE Lab. #include using std::cout; using std::cin; using std::ios; #include using std::ofstream; struct Client { int a; char n[20]; double b; }; int main() { ofstream asf( "C:\\client.txt", ios::app ); if ( !asf ) return 1; Client c; cout << "Enter account name balance:\n? "; while ( cin >> c.a >> c.n >> c.b ) { asf << c.a << ' ' << c.n << ' ' << c.b << '\n'; cout << "? "; } return 0; } asf.cpp 5 Appending a Sequential File File I/O 9. File Processing A Enter account name balance: ? 0047 Jack 30.80 ? 0051 Thomas 215.53^z ^z

6 2008YeungNam Univ. SE Lab. 69. File Processing File Position Pointers File I/O 0123456789 1011121314151617181920 istream is long cur_file_pos = is.tellg() is.seekg(5, ios::beg) is.seekg(3, ios::cur) “tell get” file position pointer is.seekg(4, ios::end) is.seekg(0) is.seekg(0, ios::end) default seek direction A  The byte numbers of the next byte in the file to be read or written  The same operations can be performed with ostream MFs tellp() and seekp() “seek put” file position pointer

7 2008YeungNam Univ. SE Lab. #include using std::cout; #include using std::ifstream; int main() { int x, n, s; // number, count, sum double m; // mean ifstream nf("c:\\numbers.txt"); if ( !nf ) return 1; n = s = 0; while ( nf >> x ) ++n, s += x; m = double(s) / n; nf.clear(); // reset EOFBIT nf.seekg(0); // move to beginning of file n = 0; while ( nf >> x ) if ( x > m ) ++n; cout << n << " number" << (n<2?"":"s") << " exceed" << (n<2?"s":"") << " the average " << m << '\n'; return 0; } avg.cpp 7  Count the numbers exceeding their average value. File I/O 9. File Processing A Reading a File Twice 12 numbers exceed the average 23.5

8 2008YeungNam Univ. SE Lab. 8 File I/O 9. File Processing A Updating Sequential Access Files  insert  delete

9 2008YeungNam Univ. SE Lab. 9 0 1 2 : 21 22 23 : : 33 34 35 : : 46 : 50 : : 99 File I/O 9. File Processing A Random-Access File  analogous to an array of records on a disc. Jane +0.30800e+02Gloria -0.31240e+02Doe +0.89000e+02Jack +0.30800e+02 Thomas +0.21553e+03 35 01 51 23 47

10 2008YeungNam Univ. SE Lab. 10 File I/O 9. File Processing A Creating a Random-Access File cout << "Account[1.." << capacity << "] Name Balance:\n? "; while ( cin >> a >> c.n >> c.b ) { if ( a 100 ) continue; orf.seekp( (a-1)*sz ); orf.write( reinterpret_cast< const char*>(&c), sz ); cout << "? "; } orf.close(); return 0; } #include using std::cout; using std::cin; using std::ios; #include using std::ofstream; struct Client { char n[20]; double b; }; const int sz = sizeof( Client ); int main() { char file[ ] = "C:\\client.bin"; const int capacity = 100; ofstream orf( file, ios::binary ); if ( !orf ) return 1; int a; // account number Client c = { "", 0.0 }; for ( a = 0; a<capacity; ++a ) orf.write( reinterpret_cast< const char*>(&c), sz ); orf.close(); orf.open( file, ios::binary ); if ( !orf ) return 2; crf.cpp Account[1..100] Name Balance: ? 35 Doe 89.00 ? 1 Jane 123.50 ? 51 Thomas 215.53 ? 23 Gloria -31.24 ? 47 Jack 30.80^z ^z

11 2008YeungNam Univ. SE Lab. #include using std::cout; using std::ios; #include using std::ifstream; struct Client { char n[20]; double b; }; const int sz = sizeof( Client ); int main( ) { char file[ ] = "C:\\client.bin"; const int capacity = 100; ifstream irf( file, ios::binary ); if ( !irf ) return 1; int a; // account number Client c; for ( a=1; a<=capacity; ++a ) { irf.read( reinterpret_cast (&c), sz ); if ( !irf ) break; if ( c.n[0] != '\0' ) cout << a <<' '<<c.n<<' '<< c.b << '\n'; } irf.close(); return 0; } rrf.cpp 11 File I/O 9. File Processing A Reading a Random-Access File Sequentially fstream fstream irf( file, ios::binary|ios::in ); 1 Jane 123.5 23 Gloria -31.24 35 Doe 89 47 Jack 30.8 51 Thomas 215.53

12 2008YeungNam Univ. SE Lab. 12 File I/O 9. File Processing A Updating Random-Access File Randomly [i|d|r|p|e] Acc ? i 3 name balance? Anny 100.00 ? r 23 Gloria -31.24 => Gloria 30.00 ? d 47 ? p 1 Jane 123.50 ? p 3 Anny 100.00 ? p 23 Gloria 30.00 ? p 47 0.00 ? e ^z ^z #include using namespace std; #define Rec( t ) reinterpret_cast (&t), sz struct Client { char n[20]; double b; }; const int sz = sizeof( Client ); int main() { char file[] = "C:\\client.bin"; const int capacity = 100; fstream urf( file, ios::in|ios::out ); if ( !urf ) return 1; Client c; Client blank = { "", 0.0 }; int acc; // account char ucc; // update control code long fpp; // file position pointer urf.cpp

13 2008YeungNam Univ. SE Lab. 13 File I/O cout << setiosflags( ios::fixed ) << setprecision( 2 ); cout << "[i|d|r|p|e] acc"; while ( cout > ucc ) { cin >> acc; // need to check fpp = (acc-1)*sz; switch ( tolower(ucc) ) { case 'i': // insert cout << "name balance? "; cin >> c.n >> c.b; urf.seekp( fpp ).write( Rec(c) ); break; case 'd': // delete urf.seekp( fpp ).write( Rec(blank) ); break; case 'r': // replace urf.seekg( fpp ).read( Rec(c) ); cout "; cin >> c.n >> c.b; urf.seekp( fpp ).write( Rec(c) ); break; case 'p': // print urf.seekg( fpp ).read( Rec(c) ); cout << c.n << " " << c.b << "\n"; break; 9. File Processing A case 'e': // end return 0; } return 0; } [i|d|r|p|e] Acc ? i 3 name balance? Anny 100.00 ? r 23 Gloria -31.24 => Gloria 30.00 ? d 47 ? p 1 Jane 123.50 ? p 3 Anny 100.00 ? p 23 Gloria 30.00 ? p 47 0.00 ? e ^z

14 2008YeungNam Univ. SE Lab. 14 File I/O of Objects File I/O 9. File Processing #include using std::cin; using std::cout; using std::istream; using std::ostream; #include class Dog { public: Dog() : name(new char(0)), age(0) { } Dog(char* s, int a=0) : age(a) { name = strdup( s ); } ~Dog() { delete []name; } friend istream& operator >>( istream&, Dog& ); friend ostream& operator <<( ostream&, const Dog& ); private: char* name; int age; }; Dog.h

15 2008YeungNam Univ. SE Lab. #include "Dog.h" #include istream& operator>>( istream& is, Dog& d ) { char s[30], c; while ( isspace( is.peek() ) ) is.get(c); // skip leading white spaces is.getline( s, 30, ',' ); is >> d.age; d.name = strdup(s); return is; } ostream& operator<<(ostream& os,const Dog& d) { if ( strlen(d.name) ) os << d.name << ", " << d.age; return os; } Dog.cpp #include "Dog.h" #include using std::ofstream; using std::ifstream; using std::ios; int main() { ofstream osf("C:\\Dog.txt"); if ( !osf ) return 1; Dog d; while ( cin >> d ) osf << d; osf.close(); ifstream isf("C:\\Dog.txt"); if ( !isf ) return 2; while ( isf >> d ) cout << d << '\n'; isf.close(); return 0; } Drv.cpp 15 File I/O 9. File Processing Lucky, 5 Minky, 2 Frisky, 3 ^z Lucky, 5 Minky, 2 Frisky, 3 Press any


Download ppt "2008YeungNam Univ. SE Lab. 1 C++ views each file as a sequence of bytes terminated by EOF-marker. Header files Files are opened by creating objects of."

Similar presentations


Ads by Google