Ngôn ngữ lập trình C++ - Chương 7: Ra vào dữ liệu
C++ I/O
Hướng đối tượng
sử dụng tham chiếu, chồng hàm, chồng toán tử
An toàn về các kiểu dữ liệu
nhạy cảm với kiểu dữ liệu
báo lỗi nếu kiểu không khớp
có thể dùng cho cả kiểu người dùng tự định nghĩa và các kiểu chuẩn
làm cho C++ có khả năng mở rộng
2) 25 // accessor functions for firstName 26 void setFirstName( string ); 27 string getFirstName() const; 28 29 // accessor functions for balance 30 void setBalance( double ); 31 double getBalance() const; 32 33 private: 34 int accountNumber; 35 char lastName[ 15 ]; 36 char firstName[ 10 ]; 37 double balance; 38 39 }; // end class ClientData 40 41 #endif ClientData.cpp(1 of 4) 1 // Fig. 14.11: ClientData.cpp 2 // Class ClientData stores customer's credit information. 3 #include 4 5 using std::string; 6 7 #include 8 #include "clientData.h" 9 10 // default ClientData constructor 11 ClientData::ClientData( int accountNumberValue, 12 string lastNameValue, string firstNameValue, 13 double balanceValue ) 14 { 15 setAccountNumber( accountNumberValue ); 16 setLastName( lastNameValue ); 17 setFirstName( firstNameValue ); 18 setBalance( balanceValue ); 19 20 } // end ClientData constructor 21 22 // get account-number value 23 int ClientData::getAccountNumber() const 24 { 25 return accountNumber; 26 27 } // end function getAccountNumber ClientData.cpp(2 of 4) 28 29 // set account-number value 30 void ClientData::setAccountNumber( int accountNumberValue ) 31 { 32 accountNumber = accountNumberValue; 33 34 } // end function setAccountNumber 35 36 // get last-name value 37 string ClientData::getLastName() const 38 { 39 return lastName; 40 41 } // end function getLastName 42 43 // set last-name value 44 void ClientData::setLastName( string lastNameString ) 45 { 46 // copy at most 15 characters from string to lastName 47 const char *lastNameValue = lastNameString.data(); 48 int length = strlen( lastNameValue ); 49 length = ( length 4 5 using std::cerr; 6 using std::endl; 7 using std::ios; 8 9 #include 10 11 using std::ofstream; 12 13 #include 14 #include "clientData.h" // ClientData class definition 15 16 int main() 17 { 18 ofstream outCredit( "credit.dat", ios::binary ); 19 20 // exit program if ofstream could not open file 21 if ( !outCredit ) { 22 cerr ( &blankClient ), 34 sizeof( ClientData ) ); 35 36 return 0; 37 38 } // end main 7.13.3 Ghi dữ liệu vào vị trí tùy ý trong file truy nhập ngẫu nhiên Dùng seekp để ghi vào vị trí chính xác trong file Bản ghi đầu tiên bắt đầu từ đâu? Byte 0 Bản ghi thứ hai? Byte 0 + sizeof(object) Bản ghi bất kỳ? (Recordnum - 1) * sizeof(object) fig14_13.cpp(1 of 3) 1 // Fig. 14.13: fig14_13.cpp 2 // Writing to a random access file. 3 #include ...... 19 #include 20 #include "clientData.h" // ClientData class definition 21 22 int main() 23 { 24 int accountNumber; 25 char lastName[ 15 ]; 26 char firstName[ 10 ]; 27 double balance; 28 29 ofstream outCredit( "credit.dat", ios::binary ); 30 31 // exit program if ofstream cannot open file 32 if ( !outCredit ) { 33 cerr > accountNumber; 44 client.setAccountNumber( accountNumber ); 45 46 // user enters information, which is copied into file 47 while ( client.getAccountNumber() > 0 && 48 client.getAccountNumber() > setw( 15 ) >> lastName; 53 cin >> setw( 10 ) >> firstName; 54 cin >> balance; 55 56 // set record lastName, firstName and balance values 57 client.setLastName( lastName ); 58 client.setFirstName( firstName ); 59 client.setBalance( balance ); fig14_13.cpp(3 of 3) 60 61 // seek position in file of user-specified record 62 outCredit.seekp( ( client.getAccountNumber() - 1 ) * 63 sizeof( ClientData ) ); 64 65 // write user-specified information in file 66 outCredit.write( 67 reinterpret_cast( &client ), 68 sizeof( ClientData ) ); 69 70 // enable user to specify another account number 71 cout > accountNumber; 73 client.setAccountNumber( accountNumber ); 74 75 } // end while 76 77 return 0; 78 79 } // end main fig14_13.cppoutput (1 of 1) Enter account number (1 to 100, 0 to end input) ? 37 Enter lastname, firstname, balance ? Barker Doug 0.00 Enter account number ? 29 Enter lastname, firstname, balance ? Brown Nancy -24.54 Enter account number ? 96 Enter lastname, firstname, balance ? Stone Sam 34.98 Enter account number ? 88 Enter lastname, firstname, balance ? Smith Dave 258.34 Enter account number ? 33 Enter lastname, firstname, balance ? Dunn Stacey 314.33 Enter account number ? 0 7.13.4 Đọc tuần tự dữ liệu từ file truy nhập ngẫu nhiên read - tương tự write Đọc các byte thô từ file vào bộ nhớ inFile.read( reinterpret_cast( &number ), sizeof( int ) ); &number: địa chỉ để lưu dữ liệu sizeof(int): số byte cần đọc Không dùng inFile >> number cho dữ liệu thô - nhị phân >> nhận char * Chương trình tiếp theo lấy dữ liệu từ một file random-access duyệt tuần tự qua từng bản ghi If no data (accountNumber == 0) then skip fig14_14.cpp(1 of 2) 1 // Fig. 14.14: fig14_14.cpp 2 // Reading a random access file. ...... 25 #include "clientData.h" // ClientData class definition 26 27 void outputLine( ostream&, const ClientData & ); 28 29 int main() 30 { 31 ifstream inCredit( "credit.dat", ios::in ); 32 33 // exit program if ifstream cannot open file 34 if ( !inCredit ) { 35 cerr ( &client ), 48 sizeof( ClientData ) ); fig14_14.cpp(2 of 2) 50 // read all records from file 51 while ( inCredit && !inCredit.eof() ) { 52 53 // display record 54 if ( client.getAccountNumber() != 0 ) 55 outputLine( cout, client ); 56 57 // read next from file 58 inCredit.read( reinterpret_cast( &client ), 59 sizeof( ClientData ) ); 60 61 } // end while 62 63 return 0; 64 65 } // end main 66 67 // display single record 68 void outputLine( ostream &output, const ClientData &record ) 69 { 70 output 6 7 using std::cout; ... 15 using std::showpoint; 16 17 #include 18 19 using std::ofstream; 20 using std::ostream; 21 using std::fstream; 22 23 #include 24 25 using std::setw; 26 using std::setprecision; 27 28 #include // exit prototype 29 #include "clientData.h" // ClientData class definition fig14_15.cpp(2 of 14) 30 31 int enterChoice(); 32 void printRecord( fstream& ); 33 void updateRecord( fstream& ); 34 void newRecord( fstream& ); 35 void deleteRecord( fstream& ); 36 void outputLine( ostream&, const ClientData & ); 37 int getAccount( const char * const ); 38 39 enum Choices { PRINT = 1, UPDATE, NEW, DELETE, END }; 40 41 int main() 42 { 43 // open file for reading and writing 44 fstream inOutCredit( "credit.dat", ios::in | ios::out ); 45 46 // exit program if fstream cannot open file 47 if ( !inOutCredit ) { 48 cerr > menuChoice; // receive choice from user 109 110 return menuChoice; 111 112 } // end function enterChoice 113 114 // create formatted text file for printing 115 void printRecord( fstream &readFromFile ) 116 { 117 // create text file 118 ofstream outPrintFile( "print.txt", ios::out ); 119 120 // exit program if ofstream cannot create file 121 if ( !outPrintFile ) { 122 cerr ( &client ), 137 sizeof( ClientData ) ); 138 139 // copy all records from record file into text file 140 while ( !readFromFile.eof() ) { 141 142 // write single record to text file 143 if ( client.getAccountNumber() != 0 ) 144 outputLine( outPrintFile, client ); 145 146 // read next record from record file 147 readFromFile.read( reinterpret_cast( &client ), 148 sizeof( ClientData ) ); 149 150 } // end while 151 152 } // end function printRecord 153 fig14_15.cpp(8 of 14) 154 // update balance in record 155 void updateRecord( fstream &updateFile ) 156 { 157 // obtain number of account to update 158 int accountNumber = getAccount( "Enter account to update" ); 159 160 // move file-position pointer to correct record in file 161 updateFile.seekg( 162 ( accountNumber - 1 ) * sizeof( ClientData ) ); 163 164 // read first record from file 165 ClientData client; 166 updateFile.read( reinterpret_cast( &client ), 167 sizeof( ClientData ) ); 168 169 // update record 170 if ( client.getAccountNumber() != 0 ) { 171 outputLine( cout, client ); 172 173 // request user to specify transaction 174 cout > transaction; fig14_15.cpp(9 of 14) 177 178 // update record balance 179 double oldBalance = client.getBalance(); 180 client.setBalance( oldBalance + transaction ); 181 outputLine( cout, client ); 182 183 // move file-position pointer to correct record in file 184 updateFile.seekp( 185 ( accountNumber - 1 ) * sizeof( ClientData ) ); 186 187 // write updated record over old record in file 188 updateFile.write( 189 reinterpret_cast( &client ), 190 sizeof( ClientData ) ); 191 192 } // end if 193 194 // display error if account does not exist 195 else 196 cerr ( &client ), 214 sizeof( ClientData ) ); 215 216 // create record, if record does not previously exist 217 if ( client.getAccountNumber() == 0 ) { 218 219 char lastName[ 15 ]; 220 char firstName[ 10 ]; 221 double balance; fig14_15.cpp(11 of 14) 222 223 // user enters last name, first name and balance 224 cout > setw( 15 ) >> lastName; 226 cin >> setw( 10 ) >> firstName; 227 cin >> balance; 228 229 // use values to populate account values 230 client.setLastName( lastName ); 231 client.setFirstName( firstName ); 232 client.setBalance( balance ); 233 client.setAccountNumber( accountNumber ); 234 235 // move file-position pointer to correct record in file 236 insertInFile.seekp( ( accountNumber - 1 ) * 237 sizeof( ClientData ) ); 238 239 // insert record in file 240 insertInFile.write( 241 reinterpret_cast( &client ), 242 sizeof( ClientData ) ); 243 244 } // end if 245 fig14_15.cpp(12 of 14) 246 // display error if account previously exists 247 else 248 cerr ( &client ), 266 sizeof( ClientData ) ); 267 fig14_15.cpp(13 of 14) 268 // delete record, if record exists in file 269 if ( client.getAccountNumber() != 0 ) { 270 ClientData blankClient; 271 272 // move file-position pointer to correct record in file 273 deleteFromFile.seekp( ( accountNumber - 1 ) * 274 sizeof( ClientData ) ); 275 276 // replace existing record with blank record 277 deleteFromFile.write( 278 reinterpret_cast( &blankClient ), 279 sizeof( ClientData ) ); 280 281 cout > accountNumber; 311 312 } while ( accountNumber 100 ); 313 314 return accountNumber; 315 316 } // end function getAccount
File đính kèm:
- Ngôn ngữ lập trình C++ - Chương 7 Ra vào dữ liệu.ppt