Các phép toán File trên bộ nhớ tưởng tượng. pptx

45 312 0
Các phép toán File trên bộ nhớ tưởng tượng. pptx

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Topics  Các cấu trúc, cấp phát động  Các phép toán File trên bộ nhớ tưởng tượng.  Bài tập Cấp phát động  Một mảng các biến đã được ấn định kích thước, dùng để lưu trữ 1 lượng biến đã xác định (tại thời điểm biên dịch).  Kích thước này sẽ không thể thay đổi sau khi biên dịch.  Tuy nhiên chúng ta thường không biết trước được số lượng không gian cần thiết cho mảng .  Vì vậy nên có thể sử dụng cấp phát bộ nhớ động để khắc phục nhược điểm trên của mảng, tránh lãng phí không gian nhớ. Hàm malloc void * malloc(unsigned int nbytes);  Hàm malloc được sử dụng để cấp phát động nbytes trong bộ nhớ.  malloc trả về con trỏ tới vùng nhớ được cấp phát nếu thành công, trả về con trỏ NULL nếu thất bại.  Nên kiểm tra xem có cấp phát thành công hay không.  Phải #include<stdlib.h> Ví dụ - Đảo ngược mảng động int main(void) { int i, n, *p; printf(“Bạn muốn nhập bao nhiêu số ?\n"); scanf("%d", &n); /* Cấp phát 1 mảng int với kích thước thích hợp */ p = (int *)malloc(n * sizeof(int)); if (p == NULL) { printf("Memory allocation failed!\n"); return 1; } Ví dụ - Đảo ngược mảng động int main(void) { . . . /* Nhận các số từ bàn phím */ printf("Please enter numbers now:\n"); for (i = 0; i < n; i++) scanf("%d", &p[i]); /* Đưa ra theo thứ tự ngược lại*/ printf("The numbers in reverse order are \n"); for (i = n - 1; i >= 0; i) printf("%d ",p[i]); printf("\n"); /* Giải phóng bộ nhớ */ free(p); return 0; } Tại sao phải ép kiểu  Việc ép kiểu: p = (int *)malloc(n*sizeof(int)); Là cần thiết vì hàm malloc trả về kiểu void*: void * malloc(unsigned int nbytes);  Kiểu void* chỉ 1 kiểu con trỏ chung, có thể ép tới bất kì kiểu con trỏ nào. Giải phóng bộ nhớ đã được cấp phát void free(void *ptr);  Ta sử dụng hàm free(p) để giải phóng bộ nhớ đã được cấp phát được chỉ đến bởi con trỏ p.  Nếu p không trỏ đến 1 vùng nhớ đã được cấp phát bởi malloc, sẽ xảy ra lỗi thi hành.  Luôn luôn phải nhớ giải phóng bộ nhớ nếu không cần đến chúng nữa. Exercise 2.1  Tạo hàm my_strcat(): - Đầu vào: 2 xâu s1,s2 - Đầu ra: trả về con trỏ trỏ tới xâu nối của 2 xâu s1,s2 (được cấp phát động). - Ví dụ: xâu nối của “hello_” and “world!” là: “hello_world!” • Test hàm của bạn. Solution my_strcat() char *my_strcat(char *str1, char *str2) { int len1, len2; char *result; len1 = strlen(str1); len2 = strlen(str2); result = (char*)malloc((len1 + len2 + 1) * sizeof(char)); if (result == NULL) { printf(“cấp phát thất bại! Kiểm tra lại bộ nhớ!\n"); return NULL; } strcpy(result, str1); strcpy(result + len1, str2); return result; } Solution main() int main(void) { char str1[MAX_LEN + 1], str2[MAX_LEN + 1]; char *cat_str; printf("Please enter two strings\n"); scanf("%100s", str1); scanf("%100s", str2); cat_str = my_strcat(str1, str2); if (cat_str == NULL) { printf(“Xẩy ra lỗi trong quá trình cấp phát bộ nhớ!n"); return 1; } printf("The concatenation of %s and %s is %s\n", str1, str2, cat_str); free(cat_str); return 0; } [...]...   Viết 1 chương trình sử dụng các phép toán thao tác trên file theo khối, copy nội dung từ file lab1.txt sang file lab1a.txt Sử dụng fread(), fwrite(), feof() Solution #include enum {SUCCESS, FAIL, MAX_LEN = 80}; void BlockReadWrite (FILE *fin, FILE *fout);//hàm đọc ghi dữ liệu theo khối main(void) { FILE *fptr1, *fptr2; char filename1[]= "lab1a.txt"; char filename2[]= "lab1.txt"; int reval... Binary file (file nhị fân) chế độ Mô tả "rb" Mở 1 file binary đã có để đọc “wb” Tạo 1 file binary để ghi “ab” Mở 1 file đã có để thêm dữ liệu vào cuối “r+b” Mở 1 file binary đã có để đọc hoặc ghi "w+b“ Tạo 1 file binary để đọc hoặc ghi "a+b" Tạo mới hoặc mở 1 file đã có để thêm dữ liệu vào cuối Quản lí file: làm việc với 1 khối dữ liệu   2 hàm vào/ra là fread() và fwrite() có thể dùng để thực hiện các. .. trình trong bài 2.3 bằng cách nhận vào tên file qua tham số dòng lệnh Ví dụ: nếu tên chương trình của bạn là “filecpy” , bạn có thể sử dụng nó theo nguyên mẫu sau (trong Linux): /filecpy haiku.txt haiku2.txt Gợi ý Sử dụng argc[] và argv[] if(argc . Topics  Các cấu trúc, cấp phát động  Các phép toán File trên bộ nhớ tưởng tượng.  Bài tập Cấp phát động  Một mảng các biến đã được ấn định kích thước, dùng. độ cho Binary file (file nhị fân) chế độ Mô tả "rb" Mở 1 file binary đã có để đọc “wb” Tạo 1 file binary để ghi “ab” Mở 1 file đã có để thêm dữ liệu vào cuối “r+b” Mở 1 file binary đã. nào. Giải phóng bộ nhớ đã được cấp phát void free(void *ptr);  Ta sử dụng hàm free(p) để giải phóng bộ nhớ đã được cấp phát được chỉ đến bởi con trỏ p.  Nếu p không trỏ đến 1 vùng nhớ đã được

Ngày đăng: 28/06/2014, 22:20

Mục lục

  • Topics

  • Cấp phát động

  • Hàm malloc

  • Ví dụ - Đảo ngược mảng động

  • Slide 5

  • Tại sao phải ép kiểu

  • Giải phóng bộ nhớ đã được cấp phát

  • Exercise 2.1

  • Solution my_strcat()

  • Solution main()

  • Các cấu trúc - kiểu được định nghĩa bởi người dùng

  • ĐỊnh nghĩa 1 cấu trúc

  • Ví dụ - số phức

  • Typedef

  • Exercise 2.2

  • Solution

  • Slide 17

  • Con trỏ trong cấu trúc

  • Chế độ cho Binary file (file nhị fân)

  • Quản lí file: làm việc với 1 khối dữ liệu

Tài liệu cùng người dùng

Tài liệu liên quan