Xử lý File
lượt xem 18
download
File dữ liệu: – Có thể khởi tạo, cập nhật và xử lý file bằng ngôn ngữ C – Lưu trữ dữ liệu và truy cập file: + Kết quả chạy chương trình; + Đọc số liệu "đầu vào" lưu trữ trên file; + Trao đổi dữ liệu dạng file; + Cập nhật, thay đổi các kết quả,.....
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Xử lý File
- Xử lý File Các mục tiêu Nội dung • Mục tiêu của chương này: 1 Giới thiệu 2 Thứ bậc của dữ liệu – Khởi tạo, đọc, ghi và cập nhật file. 3 Các file và luồng dữ liệu – Xử lý file truy cập tuần tự. 4 Khởi tạo file truy cập tuần tự 5 Đọc dữ liệu từ file truy cập tuần tự – Xử lý file truy cập trực tiếp 6 Các file truy cập trực tiếp 7 Khởi tạo 1 file truy cập trực tiếp 8 Ghi dữ liệu trực tiếp lên file sử dụng lệnh truy cập trực tiếp fseek 9 Đọc dữ liệu từ file truy cập trực tiếp 10 Ví dụ Chương trình xử lý giao dịch 1 2 Giới thiệu Thứ bậc của dữ liệu • Thứ bậc của dữ liệu lưu trữ: File dữ liệu: – Bit : đơn vị dữ liệu nhỏ nhất – Có thể khởi tạo, cập nhật và xử lý file bằng • Giá trị: 0 hoặc 1 ngôn ngữ C – Byte : 8 bit – Lưu trữ dữ liệu và truy cập file: • Sử dụng lưu trữ ký tự + Kết quả chạy chương trình; + Các số thập phân, chữ cái và ký tự đặc biệt + Đọc số liệu "đầu vào" lưu trữ trên file; – Trường dữ liệu: nhóm các ký tự mang ngữ nghĩa • Ví dụ: tên người + Trao đổi dữ liệu dạng file; – Bản ghi: nhóm các trường dữ liệu có quan hệ + Cập nhật, thay đổi các kết quả,..... • Được biểu diễn bởi struct or hoặc class (C++) • Ví dụ: Một bản ghi về nhân sự, gồm: số, tên, địa chỉ, vv.... 3 4
- Các file và luồng dữ liệu Thứ bậc của dữ liệu • Mỗi file là một chuỗi các byte • Thứ bậc dữ liệu (tiếp): – Kết thúc của File được đánh dấu bằng ký tự end-of-file – File – nhóm các bản ghi có quan hệ • Ví dụ: file về tiền lương Hoặc kết thức file chỉ ra byte cụ thể. – Cơ sở dữ liệu – tập các file có liên quan • Luồng dữ liệu được khởi tạo khi một file được mở (open) – Cung cấp kênh liên kết giữa file và chương trình – Mở 1 file trả về con trỏ tới cấu trúc FILE • Ví dụ con trỏ file: + stdin - standard input (keyboard - bàn phím) + stdout - standard output (screen - màn hình) + stderr - standard error (screen - màn hình) 5 6 Các file và luồng dữ liệu Các file và luồng dữ liệu • Chức năng Read/Write trong thư viện chuẩn , • Cấu trúc FILE – fgetc – Mô tả lưu trữ dữ liệu trên File: • đọc 1 ký tự từ một file // tương đương getchar() từ bàn phím • Các phần tử file được lưu trữ dưới dạng mảng – fputc • Ghi 1 ký tự lên 1 file – Điều khiển truy cập File: • fputc( 'a', stdout ) tương đương putchar( 'a' ) • Tìm các phần tử của file trên mảng – fgets • Đọc 1 dòng từ 1 file – fputs • Viết 1 dòng lên 1 file – fscanf / fprintf • Xử lý File tương đương scanf và printf 7 8
- 23 /* write account, name and balance into file with fprintf */ Ví dụ: khởi tạo file "client.dat" và ghi lên file danh sách 24 while ( !feof( stdin ) ) { 25 gồm: tài khoản (account), tên (name), cân đối tài chính fprintf( cfPtr, "%d %s %.2f\n", account, name, balance ); 26 printf( "? " ); (balance), kết thúc nhập ấn Cltr-Z 27 scanf( "%d%s%lf", &account, name, &balance ); 28 1 } /* end while */ /* Fig. 11.3: fig11_03.c 29 2 Create a sequential file */ 30 fclose( cfPtr ); /* fclose closes file */ 3 #include 31 } /* end else */ 4 32 5 int main() 33 return 0; /* indicates successful termination */ 6 { 34 7 int account; /* account number */ 35 } /* end main */ 8 char name[ 30 ]; /* account name */ 9 double balance; /* account balance */ Enter the account, name, and balance. 10 Enter EOF to end input. 11 FILE *cfPtr; /* cfPtr = clients.dat file pointer */ ? 100 Jones 24.98 ? 200 Doe 345.67 12 ? 300 White 0.00 13 /* fopen opens file. Exit program if unable to create file */ ? 400 Stone -42.16 14 if ( ( cfPtr = fopen( "clients.dat", "w" ) ) == NULL ) { ? 500 Rich 224.62 ? ^Z 15 printf( "File could not be opened\n" ); 16 } /* end if */ 17 else { 18 printf( "Enter the account, name, and balance.\n" ); 19 printf( "Enter EOF to end input.\n" ); 20 printf( "? " ); 21 scanf( "%d%s%lf", &account, name, &balance ); 22 9 10 Khởi tạo 1 file truy cập tuần tự Khởi tạo 1 file truy cập tuần tự • C không áp đặt cấu trúc file –fprintf • Được sử dụng để ghi lên 1file – Không chỉ có các bản ghi trong 1 file • Giống như printf, chỉ khác tham số đầu tiên là con trỏ file (trỏ tới file muốn ghi) – Người lập trình phải cung cấp cấu trúc file –feof( FILE pointer ) • Trả về true nếu con trỏ đang ở phần tử cuối cùng của file • Khởi tạo 1 File –fclose( FILE pointer ) – FILE *cfPtr; • Đóng file cụ thể, đang trỏ bởi FILE pointer • Khởi tạo tên con trỏ FILE: cfPtr • Thực hiện kết thúc xử lý file • Luôn nhớ đóng file khi kết thúc chương trình – cfPtr = fopen(“clients.dat", “w”); • Lưu ý xử lý nhiều file cùng 1 thời điểm • Chức năng fopen trả về một con trỏ FILE – Chương trình có thể xử lý 1 file hoặc nhiều file • 2 tham số:tên file và chế độ mở file, "w" mở để ghi – Mỗi file cần 1 con trỏ file để xử lý. • Nếu mở file lỗi thì trả về NULL 11 12
- Khởi tạo 1 file truy cập tuần tự Đọc dữ liệu từ 1 file truy cập tuần tự Các chế độ mở file • Đọc 1 file truy cập tuần tự Mode Description – Khởi tạo con trỏ FILE, kết nối con trỏ đến file để đọc cfPtr = Open a file for reading. r fopen( “clients.dat", "r" ); Create a file for writing. If the file already exists, discard the current contents. w – Sử dụng fscanf để đọc từ file Append; open or create a file for writing at end of file. a Open a file for update (reading and writing). r+ •Giống như scanf, chỉ khác thuộc tính đầu tiên là con trỏ Create a file for update. If the file already exists, discard the current contents. w+ FILE Append; open or create a file for update; writing is done at the end of the file. a+ •fscanf( cfPtr, "%d%s%f", &accounnt, name, &balance ); Open a file for reading in binary mode. rb Create a file for writing in binary mode. If the file already exists, discard the wb – Dữ liệu đọc từ bắt đầu file đến kết thúc - gặp EOF current contents. – Con trỏ vị trí File Append; open or create a file for writing at end of file in binary mode. ab Open a file for update (reading and writing) in binary mode. rb+ •Chỉ ra số byte tiếp theo để đọc / ghi Create a file for update in binary mode. If the file already exists, discard the wb+ – rewind( cfPtr ) current contents. Append; open or create a file for update in binary mode; writing is done at the ab+ • Đưa con trỏ về đầu file (byte 0) end of the file. Fig. 11.6 File open modes. 13 14 27 fclose( cfPtr ); /* fclose closes the file */ Ví dụ: đọc lại file text 28 } /* end else */ 29 30 return 0; /* indicates successful termination */ 1 /* Fig. 11.7: fig11_07.c 31 2 Reading and printing a sequential file */ 32 } /* end main */ 3 #include 4 Account Name Balance 5 int main() 100 Jones 24.98 6 { 200 Doe 345.67 300 White 0.00 7 int account; /* account number */ 400 Stone -42.16 8 char name[ 30 ]; /* account name */ 500 Rich 224.62 9 double balance; /* account balance */ 10 11 FILE *cfPtr; /* cfPtr = clients.dat file pointer */ 12 13 /* fopen opens file; exits program if file cannot be opened */ 14 if ( ( cfPtr = fopen( "clients.dat", "r" ) ) == NULL ) { 15 printf( "File could not be opened\n" ); 16 } /* end if */ 17 else { /* read account, name and balance from file */ 18 printf( "%-10s%-13s%s\n", "Account", "Name", "Balance" ); 19 fscanf( cfPtr, "%d%s%lf", &account, name, &balance ); 20 21 /* while not end of file */ 22 while ( !feof( cfPtr ) ) { 23 printf( "%-10d%-13s%7.2f\n", account, name, balance ); 24 fscanf( cfPtr, "%d%s%lf", &account, name, &balance ); 25 } /* end while */ 15 16 26
- 26 scanf( "%d", &request ); Ví dụ: Với file "Client.dat", thực hiện hiển thị những người 27 tiền Blance = 0; Blance > 0; Blance < 0 28 /* process user's request */ 29 while ( request != 4 ) { 1 /* Fig. 11.8: fig11_08.c 30 2 Credit inquiry program */ 31 /* read account, name and balance from file */ 3 #include 32 fscanf( cfPtr, "%d%s%lf", &account, name, &balance ); 4 33 5 /* function main begins program execution */ 34 switch ( request ) { 6 int main() 35 7{ 36 case 1: 8 int request; /* request number */ 37 printf( "\nAccounts with zero balances:\n" ); 9 int account; /* account number */ 38 10 double balance; /* account balance */ 39 /* read file contents (until eof) */ 11 char name[ 30 ]; /* account name */ 40 while ( !feof( cfPtr ) ) { 12 FILE *cfPtr; /* clients.dat file pointer */ 41 13 42 if ( balance == 0 ) { 14 /* fopen opens the file; exits program if file cannot be opened */ 43 printf( "%-10d%-13s%7.2f\n", 15 if ( ( cfPtr = fopen( "clients.dat", "r" ) ) == NULL ) { 44 account, name, balance ); 16 printf( "File could not be opened\n" ); 45 } /* end if */ 17 } /* end if */ 46 18 else { 47 /* read account, name and balance from file */ 19 48 fscanf( cfPtr, "%d%s%lf", 20 /* display request options */ 49 &account, name, &balance ); 21 printf( "Enter request\n" 50 } /* end while */ 22 " 1 - List accounts with zero balances\n" 51 23 " 2 - List accounts with credit balances\n" 24 " 3 - List accounts with debit balances\n" 17 18 25 " 4 - End of run\n? " ); 52 75 b reak; /* read file contents (until eof) */ 53 76 while ( !feof( cfPtr ) ) { 54 77 c ase 2: 55 78 p rintf( "\nAccounts with credit balances:\n" ); if ( balance > 0 ) { 56 79 printf( "%-10d%-13s%7.2f\n", 57 80 / * read file contents (until eof) */ account, name, balance ); 58 81 w hile ( !feof( cfPtr ) ) { } /* end if */ 59 82 60 i f ( balance < 0 ) { 83 /* read account, name and balance from file */ 61 p rintf( "%-10d%-13s%7.2f\n", 84 fscanf( cfPtr, "%d%s%lf", 62 a ccount, name, balance ); 85 &account, name, &balance ); 63 } / * end if */ 86 } /* end while */ 64 87 65 / * read account, name and balance from file */ 88 break; 66 f scanf( cfPtr, "%d%s%lf", 89 67 & account, name, &balance ); 90 } /* end switch */ 68 } / * end while */ 91 69 92 rewind( cfPtr ); /* return cfPtr to beginning of file */ 70 b reak; 93 71 94 printf( "\n? " ); 72 c ase 3: 95 scanf( "%d", &request ); 73 p rintf( "\nAccounts with debit balances:\n" ); 96 } /* end while */ 74 97 19 20
- 98 p rintf( "End of run.\n" ); 99 f close( cfPtr ); /* fclose closes the file */ Đọc dữ liệu từ 1 file truy cập tuần tự 100 } / * end else */ 101 102 r eturn 0; /* indicates successful termination */ • Truy cập tuần tự file 103 104 } / * end main */ – Các trường dữ liệu có thể có kích thước khác nhau Enter request • 1, 34, -890 là số nguyên, nhưng kích thước 1 - List accounts with zero balances 2 - List accounts with credit balances 3 - List accounts with debit balances khác nhau trên đĩa 4 - End of run ?1 Accounts with zero balances: (old data in file) 300 White 0.00 400 Jones 32.87 300 White 0.00 If we want to change White's name to Worthington, ?2 Accounts with credit balances: 300 Worthington 0.00 400 Stone -42.16 ?3 300 White 0.00 400 Jones 32.87 Data gets overwritten Accounts with debit balances: 100 Jones 24.98 300 Worthington 0.00ones 32.87 200 Doe 345.67 500 Rich 224.62 ?4 End of run. 21 22 Truy cập trực tiếp trên File Khởi tạo file truy cập trực tiếp • Truy cập trực tiếp trên files • Chức năng I/O – fwrite • Các bản ghi, phần tử trên file có kích thước bằng nhau • Ghi các byte từ bộ nhớ lên file – fread • Đọc các byte từ file lên bộ nhớ 0 100 200 300 400 500 } byte offsets – Cú pháp: fwrite( &number, sizeof( int ), 1, myPtr ); • &number – tham số ghi lên file • sizeof( int ) – Số byte ghi 100 100 100 100 100 100 • 1 – Số phần tử ghi bytes bytes bytes bytes bytes bytes – Trong trường hợp trên 1 phần tử được ghi • myPtr – Con trỏ File 23 24
- Ví dụ: khởi tạo file và ghi lên file "credit.dat" với các phần tử dạng cấu trúc (bản ghi) Khởi tạo file truy cập trực tiếp 1 /* Fig. 11.11: fig11_11.c 2 Creating a randomly accessed file sequentially */ 3 #include 4 • Ghi dữ liệu dạng cấu trúc (struct) lên file 5 /* clientData structure definition */ 6 struct clientData { fwrite( &myObject, sizeof (struct myStruct), 1, myPtr ); 7 int acctNum; /* account number */ 8 char lastName[ 15 ]; /* account last name */ • & myObject – tham số "cấu trúc" ghi lên file 9 char firstName[ 10 ]; /* account first name */ • sizeof( struct myStruct ): Số byte ghi - kích thước của cấu trúc 10 double balance; /* account balance */ 11 }; /* end structure clientData */ • 1 – Số phần tử ghi 12 13 int main() – Trong trường hợp trên 1 phần tử được ghi 14 { 15 int i; /* counter */ • myPtr – Con trỏ File 16 17 /* create clientData with no information */ 18 struct clientData blankClient = { 0, "", "", 0.0 }; 19 20 FILE *cfPtr; /* credit.dat file pointer */ 21 22 /* fopen opens the file; exits if file cannot be opened */ 23 if ( ( cfPtr = fopen( "credit.dat", "wb" ) ) == NULL ) { 24 printf( "File could not be opened.\n" ); 25 26 25 } /* end if */ 26 else { Ghi dữ liệu trực tiếp lên file sử dụng lệnh 27 28 /* output 100 blank records to file */ truy cập trực tiếp fseek 29 for ( i = 1; i
- 26 /* require user to specify account number */ Ví dụ: nhập dữ liệu cho file "Credit.dat" sử dụng fseek. 27 printf( "Enter account number" 28 " ( 1 to 100, 0 to end input )\n? " ); 1 / * Fig. 11.12: fig11_12.c 29 scanf( "%d", &client.acctNum ); 2 W riting to a random access file */ 30 3 # include 31 /* user enters information, which is copied into file */ 4 32 while ( client.acctNum != 0 ) { 5 / * clientData structure definition */ 33 6 s truct clientData { 34 /* user enters last name, first name and balance */ 7 i nt acctNum; /* account number */ 35 printf( "Enter lastname, firstname, balance\n? " ); 8 c har lastName[ 15 ]; /* account last name */ 36 9 c har firstName[ 10 ]; /* account first name */ 37 /* set record lastName, firstName and balance value */ 10 d ouble balance; /* account balance */ 38 fscanf( stdin, "%s%s%lf", client.lastName, 1 1 } ; /* end structure clientData */ 39 client.firstName, &client.balance ); 12 40 1 3 i nt main() 41 /* seek position in file of user-specified record */ 14 { 42 fseek( cfPtr, ( client.acctNum - 1 ) * 15 F ILE *cfPtr; /* credit.dat file pointer */ 43 sizeof( struct clientData ), SEEK_SET ); 16 44 17 / * create clientData with no information */ 45 /* write user-specified information in file */ 18 s truct clientData client = { 0, "", "", 0.0 }; 46 fwrite( &client, sizeof( struct clientData ), 1, cfPtr ); 19 47 20 / * fopen opens the file; exits if file cannot be opened */ 48 /* enable user to specify another account number */ 21 i f ( ( cfPtr = fopen( "credit.dat", "rb+" ) ) == NULL ) { 49 printf( "Enter account number\n? " ); 22 p rintf( "File could not be opened.\n" ); 50 scanf( "%d", &client.acctNum ); 23 } / * end if */ 24 e lse { 29 30 25 51 } /* end while */ 52 Ghi dữ liệu trực tiếp lên file truy cập trực tiếp 53 fclose( cfPtr ); /* fclose closes the file */ 54 } /* end else */ 55 56 return 0; /* indicates successful termination */ 57 58 } /* end main */ 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 31 32
- Ví dụ: Mở và đọc file dữ liệu cấu trúc "credit.dat" Đọc dữ liệu trực tiếp từ file 1 /* Fig. 11.15: fig11_15.c 2 Reading a random access file sequentially */ • fread 3 #include 4 – Đọc số byte cụ thể từ file vào bộ nhớ 5 /* clientData structure definition */ 6 struct clientData { – Cú pháp: 7 int acctNum; /* account number */ 8 char lastName[ 15 ]; /* account last name */ fread( &client, sizeof (struct clientData), 1, myPtr ); 9 char firstName[ 10 ]; /* account first name */ 10 double balance; /* account balance */ – Có thể đọc một số phẩn tử cùng 1 lúc, tham số là array 11 }; /* end structure clientData */ 12 • Con trỏ trỏ đến array 13 int main() 14 { • Chỉ ra số phần tử cần đọc 15 FILE *cfPtr; /* credit.dat file pointer */ 16 – Đọc nhiều phần tử, xác định bởi thuộc tính thứ 3 17 /* create clientData with no information */ 18 struct clientData client = { 0, "", "", 0.0 }; 19 20 /* fopen opens the file; exits if file cannot be opened */ 21 if ( ( cfPtr = fopen( "credit.dat", "rb" ) ) == NULL ) { 22 printf( "File could not be opened.\n" ); 23 } /* end if */ 33 34 24 e lse { Acct Last Name First Name Balance 25 p rintf( "%-6s%-16s%-11s%10s\n", "Acct", "Last Name", 29 Brown Nancy -24.54 26 " First Name", "Balance" ); 33 Dunn Stacey 314.33 37 Barker Doug 0.00 27 88 Smith Dave 258.34 28 / * read all records from file (until eof) */ 96 Stone Sam 34.98 29 w hile ( !feof( cfPtr ) ) { 30 f read( &client, sizeof( struct clientData ), 1, cfPtr ); 31 32 / * display record */ 33 i f ( client.acctNum != 0 ) { 34 p rintf( "%-6d%-16s%-11s%10.2f\n", 35 c lient.acctNum, client.lastName, 36 c lient.firstName, client.balance ); 37 } / * end if */ 38 39 } / * end while */ 40 41 f close( cfPtr ); /* fclose closes the file */ 42 } / * end else */ 43 44 r eturn 0; /* indicates successful termination */ 45 46 } / * end main */ 35 36
- 1 /* Fig. 11.16: fig11_16.c Các tình huống xử lý file minh hoạ trong 2 This program reads a random access file sequentially, updates data 3 already written to the file, creates new data to be placed in the Chương trình xử lý giao dịch 4 file, and deletes data previously in the file. */ 5 #include 6 7 /* clientData structure definition */ 8 struct clientData { 9 int acctNum; /* account number */ • Ví dụ minh hoạ về quản lý ngân hàng 10 char lastName[ 15 ]; /* account last name */ 11 char firstName[ 10 ]; /* account first name */ • Các thao tác 12 double balance; /* account balance */ 13 }; /* end structure clientData */ 14 – Cập nhật các tài khoản đã tồn tại 15 /* prototypes */ 16 int enterChoice( void ); – Thêm tài khoản mới 17 void textFile( FILE *readPtr ); 18 void updateRecord( FILE *fPtr ); – Xoá các tài khoản 19 void newRecord( FILE *fPtr ); 20 void deleteRecord( FILE *fPtr ); – Lưu các tài khoản trong file dạng text 21 22 int main() 23 { 24 FILE *cfPtr; /* credit.dat file pointer */ 25 int choice; /* user's choice */ 26 37 38 27 /* fopen opens the file; exits if file cannot be opened */ 48 /* create record */ 28 if ( ( cfPtr = fopen( "credit.dat", "rb+" ) ) == NULL ) { 49 case 3: 29 printf( "File could not be opened.\n" ); 50 newRecord( cfPtr ); 30 } /* end if */ 51 break; 31 else { 52 32 53 /* delete existing record */ 33 /* enable user to specify action */ 54 case 4: 34 while ( ( choice = enterChoice() ) != 5 ) { 55 deleteRecord( cfPtr ); 35 56 break; 36 switch ( choice ) { 57 37 58 /* display message if user does not select valid choice */ 38 /* create text file from record file */ 59 default: 39 case 1: 60 printf( "Incorrect choice\n" ); 40 textFile( cfPtr ); 61 break; 41 break; 62 42 63 } /* end switch */ 43 /* update record */ 64 44 case 2: 65 } /* end while */ 45 updateRecord( cfPtr ); 66 46 break; 67 47 fclose( cfPtr ); /* fclose closes the file */ 68 } /* end else */ 69 70 return 0; /* indicates successful termination */ 71 72 } /* end main */ 73 39 40
- 74 /* create formatted text file for printing */ 95 /* write single record to text file */ 75 void textFile( FILE *readPtr ) 96 if ( client.acctNum != 0 ) { 76 { 97 fprintf( writePtr, "%-6d%-16s%-11s%10.2f\n", 77 FILE *writePtr; /* accounts.txt file pointer */ 98 client.acctNum, client.lastName, 78 99 client.firstName, client.balance ); 79 /* create clientData with no information */ 100 } /* end if */ 80 struct clientData client = { 0, "", "", 0.0 }; 101 81 102 } /* end while */ 82 /* fopen opens the file; exits if file cannot be opened */ 103 83 if ( ( writePtr = fopen( "accounts.txt", "w" ) ) == NULL ) { 104 fclose( writePtr ); /* fclose closes the file */ 84 printf( "File could not be opened.\n" ); 105 } /* end else */ 85 } /* end if */ 106 86 else { 107 } /* end function textFile */ 87 rewind( readPtr ); /* sets pointer to beginning of record file */ 108 88 fprintf( writePtr, "%-6s%-16s%-11s%10s\n", 109 /* update balance in record */ 89 "Acct", "Last Name", "First Name","Balance" ); 110 void updateRecord( FILE *fPtr ) 90 111 { 91 /* copy all records from record file into text file */ 112 int account; /* account number */ 92 while ( !feof( readPtr ) ) { 113 double transaction; /* account transaction */ 93 fread( &client, sizeof( struct clientData ), 1, readPtr ); 114 94 115 /* create clientData with no information */ 116 struct clientData client = { 0, "", "", 0.0 }; 117 41 42 118 /* obtain number of account to update */ 143 119 printf( "%-6d%-16s%-11s%10.2f\n", printf( "Enter account to update ( 1 - 100 ): " ); 144 120 client.acctNum, client.lastName, scanf( "%d", &account ); 145 121 client.firstName, client.balance ); 146 122 /* move file pointer to correct record in file */ 147 123 /* move file pointer to correct record in file */ fseek( fPtr, ( account - 1 ) * sizeof( struct clientData ), 148 124 fseek( fPtr, ( account - 1 ) * sizeof( struct clientData ), SEEK_SET ); 149 125 SEEK_SET ); 150 126 /* read record from file */ 151 127 /* write updated record over old record in file */ fread( &client, sizeof( struct clientData ), 1, fPtr ); 152 128 fwrite( &client, sizeof( struct clientData ), 1, fPtr ); 153 129 } /* end else */ /* display error if account does not exist */ 154 130 if ( client.acctNum == 0 ) { 155 } /* end function updateRecord */ 131 printf( "Acount #%d has no information.\n", account ); 156 132 } /* end if */ 157 /* delete an existing record */ 133 else { /* update record */ 158 void deleteRecord( FILE *fPtr ) 134 printf( "%-6d%-16s%-11s%10.2f\n\n", 159 { 135 client.acctNum, client.lastName, 160 136 /* create two clientDatas and initialize blankClient */ client.firstName, client.balance ); 161 137 struct clientData client; 162 138 struct clientData blankClient = { 0, "", "", 0 }; /* request user to specify transaction */ 163 139 printf( "Enter charge ( + ) or payment ( - ): " ); 164 140 int accountNum; /* account number */ scanf( "%lf", &transaction ); 165 141 client.balance += transaction; /* update record balance */ 142 43 44
- 192 } /* end function deleteRecord */ 166 /* obtain number of account to delete */ 167 193 printf( "Enter account number to delete ( 1 - 100 ): " ); 168 scanf( "%d", &accountNum ); 194 /* create and insert record */ 169 195 void newRecord( FILE *fPtr ) 170 /* move file pointer to correct record in file */ 196 { 171 fseek( fPtr, ( accountNum - 1 ) * sizeof( struct clientData ), 197 /* create clientData with no information */ 172 SEEK_SET ); 198 struct clientData client = { 0, "", "", 0.0 }; 173 199 174 /* read record from file */ 200 int accountNum; /* account number */ 175 fread( &client, sizeof( struct clientData ), 1, fPtr ); 201 176 202 /* obtain number of account to create */ 177 /* display error if record does not exist */ 203 printf( "Enter new account number ( 1 - 100 ): " ); 178 if ( client.acctNum == 0 ) { 204 scanf( "%d", &accountNum ); 179 printf( "Account %d does not exist.\n", accountNum ); 205 180 } /* end if */ 206 /* move file pointer to correct record in file */ 181 else { /* delete record */ 207 182 fseek( fPtr, ( accountNum - 1 ) * sizeof( struct clientData ), 183 208 /* move file pointer to correct record in file */ SEEK_SET ); 184 fseek( fPtr, ( accountNum - 1 ) * sizeof( struct clientData ), 209 185 SEEK_SET ); 210 /* read record from file */ 186 211 fread( &client, sizeof( struct clientData ), 1, fPtr ); 187 /* replace existing record with blank record */ 212 188 fwrite( &blankClient, 189 sizeof( struct clientData ), 1, fPtr ); 190 } /* end else */ 191 45 46 213 / * display error if account previously exists */ 238 /* enable user to input menu choice */ 214 i f ( client.acctNum != 0 ) { 239 int enterChoice( void ) 215 p rintf( "Account #%d already contains information.\n", 240 { 216 c lient.acctNum ); 241 int menuChoice; /* variable to store user's choice */ 217 } / * end if */ 242 218 e lse { /* create record */ 243 /* display available options */ 219 244 printf( "\nEnter your choice\n" 220 / * user enters last name, first name and balance */ 245 "1 - store a formatted text file of acounts called\n" 221 p rintf( "Enter lastname, firstname, balance\n? " ); 246 " \"accounts.txt\" for printing\n" 222 s canf( "%s%s%lf", &client.lastName, &client.firstName, 247 "2 - update an account\n" 223 & client.balance ); 248 "3 - add a new account\n" 224 249 "4 - delete an account\n" 225 c lient.acctNum = accountNum; 250 "5 - end program\n? " ); 226 251 227 / * move file pointer to correct record in file */ 252 scanf( "%d", &menuChoice ); /* receive choice from user */ 228 f seek( fPtr, ( client.acctNum - 1 ) * 253 229 s izeof( struct clientData ), SEEK_SET ); 254 return menuChoice; 230 255 231 / * insert record in file */ 256 } /* end function enterChoice */ 232 f write( &client, 233 s izeof( struct clientData ), 1, fPtr ); 234 } / * end else */ 235 236 } / * end function newRecord */ 237 47 48
- After choosing option 1 accounts.txt contains: BÀI TẬP Acct Last Name First Name Balance 29 Brown Nancy -24.54 33 Dunn Stacey 314.33 1. Viết chương trình: 37 Barker Doug 0.00 88 Smith Dave 258.34 – Nhập vào 2 ma trận A, B kích thước N xN 96 Stone Sam 34.98 – Lưu 2 ma trận A, B vào một file văn bản, mỗi hàng của After choosing option 2 accounts.txt contains: ma trận được viết trên một dòng. Enter account to update ( 1 - 100 ): 37 37 Barker Doug 0.00 – Đọc lại 2 ma trận từ tệp. Tính C = A.B, rồi ghi tiếp ma Enter charge ( + ) or payment ( - ): +87.99 trận C vào tệp. 37 Barker Doug 87.99 2. Lập chương trình xem và sửa nội dung của một tệp văn After choosing option 3 accounts.txt contains: bản bất kỳ (tạo sẵn một tệp văn bản *.txt và khi thực Enter new account number ( 1 - 100 ): 22 hiện chương trình, tên tệp được nhập vào từ bàn phím). Enter lastname, firstname, balance ? Johnston Sarah 247.45 Chương trình cho hiện lên màn hình từng “câu” trong tệp. Dùng phím mũi tên để di chuyển đến kí tự cần sửa. Bấm Enter để sửa. Bấm ESC để kết thúc chương trình. 49 50 BÀI TẬP 3. Sử dụng kiểu struct để mô tả thông tin về một người, gồm: họ tên, tuổi, lương. Hãy lập chương trình thực hiện các yêu cầu: – Vào số liệu của n người và ghi vào một tệp nhị phân. – Tìm và hiển thị họ tên người có lương cao nhất. – Tính và hiển thị trung bình cộng của trường lương và hiển thị danh sách người có lương >= giá trị trung bình cộng này. 51
CÓ THỂ BẠN MUỐN DOWNLOAD
-
python rất là cơ bản
92 p | 337 | 61
-
Xử lý file PDF bằng phần mềm có bản quyền
9 p | 158 | 29
-
Bài giảng Xử lý kỹ xảo với After Effect: Bài 2
50 p | 123 | 29
-
Python cơ bản
92 p | 108 | 28
-
Bài giảng Cấu trúc máy tính: Lập trình xử lý đĩa và file
65 p | 139 | 25
-
Chương 12: Khám phá cách xử lý file văn bản và chuỗi
19 p | 133 | 23
-
Xử lý video mạnh mẽ với phần mềm chuyên nghiệp với uRex Video Converter
9 p | 143 | 22
-
All about File I/O in C++
13 p | 156 | 19
-
Chương 12: Khám phá cách xử lý file TEXT và chuỗi
20 p | 171 | 15
-
Bài giảng Cấu trúc máy tính - Chương 12: Lập trình xử lý đĩa và file
65 p | 83 | 8
-
Bài giảng Nhập môn lập trình Java: Bài 8 - Võ Tấn Dũng
50 p | 53 | 8
-
Bài giảng Cấu trúc máy tính: Chương 12 - Ngô Phước Nguyên
65 p | 55 | 8
-
Bài giảng Hướng dẫn lập trình VB.NET - Chương 12: Khám phá cách xử lý file TEXT và chuỗi
19 p | 84 | 7
-
Xử lý file Word không cần MS Office
5 p | 102 | 6
-
Bài giảng Lập trình web nâng cao: Chương 7 - Trường ĐH Văn Hiến
16 p | 14 | 5
-
Bài giảng Cơ sở lập trình nâng cao - Chương 2: Ôn tập kỹ thuật xử lý file – Mảng – Xâu ký tự
15 p | 61 | 4
-
Bài giảng Cấu trúc máy tính và lập trình hợp ngữ - Chương 12: Lập trình xử lý đĩa và file
65 p | 80 | 4
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn