Programming c: posts 14

Chào chúng ta đang theo dõi khóa đào tạo và huấn luyện lập trình trực tuyến ngữ điệu C++.

Bạn đang xem: Programming c: posts 14

Trong bài học này, chúng ta sẽ cùng mày mò về những khái niệm về file và cách để thao tác với file trong ngôn từ lập trình C/C++.

File

Nếu máy tính xách tay của chúng ta có ổ cứng, hoặc chúng ta có USB hoặc bất kỳ thiết bị lưu trữ nào thì cứng cáp chắn các bạn đã từng thao tác làm việc với File. Khi các bạn chơi một game offline, tin tức nhân vật, điểm số, ... Sẽ tiến hành lưu trữ vào File để khi lịch trình game bị tắt đi thì chúng ta không nên chơi lại từ bỏ đầu. Khi chúng ta cài đặt cấu hình cho 1 phần mềm với tắt đi, cấu hình đó được lưu vào File nhằm lần thao tác tiếp theo sẽ sử dụng. Tốt khi các bạn biên dịch một công tác C++ trên Visual Studio 2015, C++ Compiler của Visual studio sẽ đọc mã nguồn các bạn đã viết trong các file *.turkcefilmizle.org để kiểm tra lỗi với dịch chúng sang tệp tin *.obj. Ngay cả hệ quản lý Windows mà chúng ta đang áp dụng cũng là tập hợp của nhiều file được giữ trữ bên phía trong phân vùng ổ đĩa dùng cho Hệ điều hành...

Đó là 1 vài ví dụ cho thấy thêm sự tồn tại của tệp tin trong lắp thêm tính. Vậy thì họ đã thao tác với phần đa File đó như vậy nào?

Làm việc với File bọn họ chỉ gồm các thao tác làm việc cơ bản như: tạo nên file mới, đọc dữ liệu trong file, ghi tài liệu vào file, xóa file... Và họ làm điều ấy hằng ngày, khi họ chơi game, lúc xem phim trên thiết bị tính, ... Và ngay cả khi họ lập trình, mã mối cung cấp của bọn họ được lưu lại xuống file mã nguồn lúc nhấn tổ hợp phím Ctrl + S.

Theo định nghĩa trên Wikipedia về computer file: Một tệp tin trên laptop là một tài nguyên dùng để lưu trữ tin tức lâu dài, sử dụng cho các chương trình máy tính.

Cũng y như việc lưu trữ dữ liệu tạm thời trên RAM, tệp tin cũng tàng trữ dữ liệu bên dưới dạng nhị phân (0 hoặc 1), tuy vậy tùy vào định hình của file cùng cách biến đổi của mỗi phần mềm đọc tệp tin mà họ có số đông kiểu thông tin khác nhau. Ví dụ file .png thì được chuyển về ngoài mặt ảnh, ứng dụng Microsoft Word chuyển dãy bit nhị phân về dạng text...

Trong ngữ điệu lập trình C/C++: file là hình dáng đối tượng, nó xác minh một stream cùng chứa những thông tin cần thiết để điều khiển, bao gồm một con trỏ trỏ mang lại buffer của nó, những chỉ mục và trạng thái của nó.

Các bạn cũng có thể hiểu file (trong ngữ điệu lập trình C/C++) là 1 trong kiểu đối tượng người sử dụng mà trải qua nó bạn có thể thao tác với dữ liệu được giữ trữ bên phía trong File (chứ không phải là một trong File trên thứ tính).

Để các bạn không bị nhầm lẫn, mình đang nói đến kiểu tài liệu FILE được khái niệm trong thư viện cstdio (hay stdio.h) mà tất cả thể chúng ta đã từng học trong ngôn ngữ C. Họ sẽ học cách sử dụng các Stream để thao tác làm việc với file cố gắng vì áp dụng kiểu dữ liệu FILE trong các bài học tập sau, mà lại mình suy nghĩ kiểu dữ liệu FILE trong tủ sách cstdio cũng có những ưu thế riêng của nó phải mình không vứt qua bài học kinh nghiệm này.

Làm bài toán với tệp tin type trong C/C++

Trong bài học kinh nghiệm này, mình vẫn hướng dẫn chúng ta thực hiện các thao tác như mở file, đọc với ghi tài liệu trong file... Bọn họ cần thao tác làm việc trên một file rõ ràng nào đó phải mình sẽ khởi tạo một file với tên file là my_document.txt trong folder Desktop có đường truyền trên lắp thêm mình là: C:/Users/ADMIN/Desktop/my_document.txt

Để làm việc với file, bọn họ cần biết vị trí của file (thông qua đường dẫn) để bé trỏ thứ hạng FILE có thể tạo được luồng dữ liệu giữa người dùng và file trên thứ lưu trữ.

#include #include int main()const char *filePath = "C:/Users/ADMIN/Desktop/my_document.txt";FILE *file;return 0;Open fileĐể mở một file, các chúng ta cũng có thể sử dụng hàm fopen được định nghĩa trong thư viện cstdio:

FILE* fopen(const char *file, const char *mode);Hàm fopen có thể chấp nhận được tạo một liên kết đến file với đường dẫn được tàng trữ bởi tham số trang bị nhất. Nếu tệp tin không tồn tại, file new sẽ được tạo nên với tên file như trong mặt đường dẫn. Tham số sản phẩm hai xác định kiểu truy vấn vào file. Bảng tiếp sau đây liệt kê những mode dùng để làm mở một tệp tin trong C:


*

Nếu mở file thành công, một add của một đối tượng kiểu FILE sẽ được trả về. Nếu như mở file thua kém thì trả về NULL.

const char *filePath = "C:/Users/ADMIN/Desktop/my_document.txt";FILE *file;file = fopen(filePath, "r");if (!file)std::cout << "Can not xuất hiện this file" << std::endl;elsestd::cout << "File is opened" << std::endl;Trong đoạn công tác trên, bản thân mở file đã sinh sản sẵn trong folder Desktop với mode "r" (chỉ dùng để làm đọc dữ liệu).

Các bạn cần lưu ý rằng file trong máy vi tính tồn tại ở hai dạng: tệp tin văn bạn dạng và file bị mã hóa.

File văn phiên bản là các file mà các bạn có thể đọc được lúc mở bằng những trình soạn thảo văn bản, thông thường những file này được định dạng Unicode (hoặc phần đông định dạng cần sử dụng cho văn phiên bản khác).

File bị mã hóa (thường điện thoại tư vấn là file nhị phân) quan trọng đọc được lúc mở file bằng những trình soạn thảo văn bản. Sử dụng File bị mã hóa giúp chúng ta bảo mật dữ liệu tốt hơn tệp tin văn bản.

Các mode mà mình đã liệt kê sống bảng trên chỉ dùng làm thao tác với tệp tin văn bản. Khi thao tác làm việc với file bị mã hóa (file nhị phân), các bạn cần nối thêm kí từ bỏ b (binary) vào tức thì sau mode mà chúng ta chọn. Ví dụ: "rb", "wb", "ab", "rb+", "r+b", ...

Close file

Sau khi làm việc với file xong, các bạn cần đóng góp file lại nhằm tránh hồ hết lỗi phân phát sinh kế bên ý muốn. Để đóng góp file, chúng ta sử dụng hàm fclose:

int fclose(FILE *file);Trong đó, tệp tin là con trỏ được dùng để làm lưu trữ địa chỉ cửa hàng của đối tượng người sử dụng FILE đã mở. Nếu đóng góp file thành công xuất sắc thì trả về quý hiếm 0, trái lại trả về EOF (End of file).

const char *filePath = "C:/Users/ADMIN/Desktop/my_document.txt";FILE *file;file = fopen(filePath, "r");if (!file)std::cout << "Can not mở cửa this file" << std::endl;elsestd::cout << "File is opened" << std::endl;fclose(file);Hàm fclose đang giải phóng tất cả dữ liệu chưa được xử lý trên tệp tin nếu chúng vẫn còn đó lưu vào buffer, đóng góp file lại, cùng giải phóng toàn khu vực nhớ mà đối tượng người tiêu dùng FILE sử dụng.

Write data lớn file

Các bạn đã thực hiện được làm việc mở với đóng file, nhưng mà lúc này, tệp tin mới tạo thành vẫn chưa tồn tại dữ liệu phải mình đang thực hiện thao tác ghi tài liệu vào tệp tin trước. Để mở tệp tin cho chế độ ghi file, họ có những mode "w", "r+", "w+", "a", "a+". Mình chỉ muốn ghi dữ liệu nên mình sẽ lựa chọn mode "w".

Nhưng trước hết, họ nên bóc thao tác ghi tệp tin ra một hàm riêng tất cả dạng:

void writeToFile(FILE *file);Hàm này sẽ tiến hành gọi sau khoản thời gian mở tệp tin và trước khi đóng file.

const char *filePath = "C:/Users/ADMIN/Desktop/my_document.txt";FILE *file;file = fopen(filePath, "w");if (!file)std::cout << "Can not mở cửa this file" << std::endl;elsestd::cout << "File is opened" << std::endl;writeToFile(file);fclose(file);Bây giờ, bọn họ chỉ để ý đến nội dung phía bên trong hàm writeToFile.

Để ghi dữ liệu vào file, chúng ta có các hàm vẫn được quan niệm sẵn trong thư viện cstdio như sau:

fputc:

int fputc(int c, tệp tin *f);Hàm fputc sẽ ghi cam kết tự tất cả mã ASCII là c vào tệp tin được trỏ cho bởi nhỏ trỏ f. Giá trị trả về là EOF nếu như ghi dữ liệu thất bại, trả về mã ASCII của kí từ bỏ được ghi vào nếu thực hiện thành công.

Ví dụ:

void writeToFile(FILE *file)int c = fputc("A", file);std::cout << c << std::endl;Sau lúc chạy công tác xong, các bạn mở tệp tin my_document.txt trên Desktop lên đang thấy kí trường đoản cú "A" đã làm được ghi vào, đồng thời trên console cũng in ra mã ASCII của kí trường đoản cú "A".

fputs:

int fputs(const char *str, file *f);Hàm fputs ghi một C-Style string vào file được trỏ mang đến bởi con trỏ f cho tới khi gặp gỡ kí từ bỏ "".

Ví dụ:

void writeToFile(FILE *file)int c = fputs("hello", file);Sau khi chạy chương trình, các bạn mở tệp tin my_document.txt sống thư mục Desktop đang thấy kí từ bỏ "A" thời gian nãy không thể nữa, núm vào đó là chuỗi kí từ "hello".

Xem thêm: 16 Năm Hồi Ức Võ Lâm Truyền Kỳ Ctc, Hồi Ức Võ Lâm Truyền Kỳ Phần 4: Ký Ức Đêm Đông

Read data from file

Đầu tiên mình sẽ tạo một hàm khác có tên là readFromFile như sau:

void readFromFile(FILE *file)//read dataĐể làm những ví dụ trong phần này, bản thân sẽ call hàm này sau khi đã gọi hàm writeToFile.

const char *filePath = "C:/Users/ADMIN/Desktop/my_document.txt";FILE *file;file = fopen(filePath, "w+");if (!file)std::cout << "Can not open this file" << std::endl;elsestd::cout << "File is opened" << std::endl;writeToFile(file);readFromFile(file);fclose(file);Lúc này, tệp tin của họ được mở để vừa đọc với ghi file, buộc phải mình sẽ áp dụng mode "w+" (hoặc "r+").

Và dưới đấy là một số hàm được định nghĩa sẵn trong tủ sách cstdio hỗ trợ chúng ta đọc tài liệu văn phiên bản từ file.

fgetc:

int fgetc(FILE *f);Hàm fgetc phát âm ra một kí tự vào file, internal file position indicator đã chuyển đến kí từ bỏ tiếp theo. Quý hiếm trả về là mã ASCII của kí tự đang đọc được.

Ví dụ:

void readFromFile(FILE *file)std::cout << (char)fgetc(file) << std::endl;fgets:

char* fgets(char *buf, int n, file *f);Hàm fgets gọi từ file ra (n - 1) kí tự, bài toán đọc dữ liệu có khả năng sẽ bị dừng nếu đọc được kí từ new line " " hoặc EOF. Chuỗi kí tự phát âm được đã lưu vào vùng nhớ được làm chủ bởi bé trỏ buf, nếu gọi dữ liệu thành công thì trả về địa chỉ của buf, trái lại trả về NULL.

Ví dụ:

void readFromFile(FILE *file)char str<255>;std::cout << fgets(str, 255, file) << std::endl;std::cout << str << std::endl;Kết quả gọi file được lưu lại vào mảng kí tự str.

Reposition stream position indicator

Ghép những ví dụ sinh hoạt trên lại, họ có một chương trình đơn giản dễ dàng minh họa cho việc ghi file cùng đọc từng dòng dữ liệu (line by line) đã làm được ghi vào file như sau:

#include #include #include void writeToFile(FILE *file)for (int i = 1; i <= 5; i++)fprintf(file, "This is an example line %d ", i);void readFromFile(FILE *file)char str<255>;while (fgets(str, 255, file) != NULL)std::cout << str;int main()const char *filePath = "C:/Users/ADMIN/Desktop/my_document.txt";FILE *file;file = fopen(filePath, "w+");if (!file)std::cout << "Can not xuất hiện this file" << std::endl;elsestd::cout << "File is opened" << std::endl;writeToFile(file);readFromFile(file);fclose(file);return 0;Tuy nhiên, kết quả cho ra màn hình không giống như mong muốn.

Nguyên nhân là khi bọn họ gọi hàm writeToFile và truyền vào đó con trỏ file, việc ghi tệp tin đã khiến cho internal file position indicator trỏ đến vị trí sau cùng trong file. Sau thời điểm quay trở lại hàm main, bọn họ tiếp tục hotline hàm readFromFile với cùng 1 con trỏ file. Như vậy, lúc họ đọc tệp tin thì họ lại bắt đầu đọc trên vị trí chấm dứt file.

Để hạn chế và khắc phục điều này, họ cần đóng nhỏ trỏ file lại với mở tạo thành một link mới bởi hàm fopen cùng với mode dùng để đọc file. Mặc dù nhiên, làm vậy nên thì code cách xử trí của họ sẽ nhiều năm hơn. Tủ sách cstdio đã hỗ trợ cho bọn họ hàm fseek để đổi khác vị trí trỏ đến trong file của internal file position indicator.

int fseek(FILE *f, long int offset, int origin);Trong đó:

f là nhỏ trỏ trỏ đến đối tượng FILE sẽ mở.

offset là số bytes được thêm vào đó tính từ địa điểm origin.

origin là địa điểm đặt bé trỏ trong file:

*

Như vậy, sau khi gọi hàm writeToFile xong, bọn họ cần dịch chuyển internal file position indicator về đầu file bằng cách như sau:

writeToFile(file);fseek(file, 0, SEEK_SET);readFromFile(file);Sau kia chạy chương trình thì thấy dữ liệu in ra màn hình đúng giống như các gì bọn họ đã ghi vào file.

Determine size of content of file

Đôi khi họ cần đọc toàn thể nội dung của file vào một trong những vùng ghi nhớ trên Heap, bọn họ sẽ cần biết trước kích cỡ nội dung bao gồm trong tệp tin để cấp phát đủ vùng nhớ trước lúc đọc file. Tủ sách cstdio chỉ cung ứng cho họ hàm ftell:

long int ftell(FILE *f);Hàm này đang trả về địa điểm của tệp tin indicator đã trỏ cho trong tệp tin (số bytes của câu chữ file mà indicator đã coi ngó qua).

Như vậy, các bạn cũng có thể đọc kích thước của văn bản trong file bằng cách dịch internal file position indicator về vị trí cuối cùng trong file rồi call hàm ftell:

__int64 size_of_file(FILE *file)fseek(file, 0, SEEK_END);__int64 size = ftell(file);fseek(file, 0, SEEK_SET);return size;Binary I/O functionsDưới đây là 2 hàm dùng để đọc và ghi tài liệu chỉ cần sử dụng cho mode nhị phân.

size_t fwrite(const void *ptr, size_t size, size_t count, file *f);Hàm fwrite dùng làm ghi hàng bit trong vùng ghi nhớ được cai quản bởi bé trỏ ptr vào file đang được trỏ bởi vì f, kích cỡ là số bytes đang copy tự vùng ghi nhớ của ptr và count là số lần ghi vùng nhớ kia xuống file.

Hàm fwrite không ân cần vùng nhớ của các bạn có định hình gì, nó quan tâm size vùng nhớ đề xuất đọc và cứ núm copy tất cả các bits và file, mỗi lần sẽ copy 1 block of bit.

size_t fread(void *ptr, size_t size, size_t count, file *f);Hàm fread đang copy count lần block of bits có kích thước là size, chuyển vào vùng ghi nhớ được trỏ đến bởi ptr, tự file vẫn được thống trị bởi f.

Sau khi điện thoại tư vấn hàm fread, internal tệp tin position indicator sẽ di chuyển tới (size * count) bytes trường đoản cú vị trí bước đầu đọc file.

Ví dụ:

#include #include #include void writeToFile(FILE *file)char *s = "Hello everyone!";fwrite(s, strlen(s), 1, file);void readFromFile(FILE *file)void *ptr = operator new(255); //allocate 255 bytes on Heapfread(ptr, 255, 1, file);(static_cast(ptr))<255> = "";std::cout << static_cast(ptr) << std::endl;int main()const char *filePath = "C:/Users/ADMIN/Desktop/my_document.txt";FILE *file;file = fopen(filePath, "w+b"); //use binary modeif (!file)std::cout << "Can not mở cửa this file" << std::endl;elsestd::cout << "File is opened" << std::endl;writeToFile(file);fseek(file, 0, SEEK_SET);readFromFile(file);fclose(file);return 0;Chạy chương trình trên mang lại ra hiệu quả là không hề ít kí trường đoản cú rác.

Như chúng ta thấy, hàm fread phát âm đúng 255 bytes trong file để lấy vào vùng lưu giữ của ptr nên các giá trị quá xuất hiện. Trong trường thích hợp này, cần sử dụng hàm fread với fwrite không phù hợp. Hàm fread với fwrite hay được dùng để làm đọc với ghi dữ liệu kiểu struct vào file.

Write & read structs

Mình vẫn giữ lại nguyên cấu trúc chương trinh như trên cùng chỉ biến đổi code vào hàm writeToFile với readFromFile.

Trước hết, mình tạo một struct dễ dàng và đơn giản như sau:

struct Employee__int32 ID;char name<50>;;Kích thước của struct này là 56 bytes (không cần là 54 bytes vì chưng cách tổ chức triển khai dữ liệu vào struct còn liên quan đến tư tưởng struct alignment). Do vậy là từng unit có kiểu Employee được tạo nên đều chiếm phần một vùng ghi nhớ có kích thước 56 bytes.

Các các bạn thử tưởng tượng nếu bọn họ sử dụng các hàm ghi file như fputs, fprintf... Thì form size tên của mọi cá nhân sẽ không giống nhau dẫn đến chúng ta không bao gồm một định dạng tầm thường để dễ quản lý nhiều Employee vào file. Bài toán đặt chúng vào trong 1 struct giúp chúng ta đọc và ghi file dễ ợt hơn nhiều.

Dưới đấy là một đoạn chương trình mẫu mã cho bài toán xử lý file để quản lý 3 Employee:

#include #include #include struct Employee__int32 ID;char name<50>;;Employee emps<3> = 1, "Le Tran Dat" , 2, "Ngo Doan Tuan" , 3, "Le Dinh Huy" ;void writeToFile(FILE *file)for (int i = 0; i < 3; i++)fwrite(&emps, sizeof(Employee), 1, file);void readFromFile(FILE *file)Employee emp;for (int i = 0; i < 3; i++)fread(&emp, sizeof(Employee), 1, file);std::cout << emp.ID << std::endl;std::cout << emp.name << std::endl;std::cout << "================================" << std::endl;int main()const char *filePath = "C:/Users/ADMIN/Desktop/my_document.txt";FILE *file;file = fopen(filePath, "w+b"); //use binary modeif (!file)std::cout << "Can not xuất hiện this file" << std::endl;elsestd::cout << "File is opened" << std::endl;writeToFile(file);fseek(file, 0, SEEK_SET);readFromFile(file);fclose(file);return 0;Các các bạn chạy demo đoạn lịch trình trên để xem kết quả.

Bây giờ bọn họ cùng mở file my_document.txt trong folder Desktop giúp thấy thử ngôn từ trong file như vậy nào:

Leave a Reply

Your email address will not be published. Required fields are marked *

  • Phim thần tài đến 1999

  • Trần huyền linh hòa phát

  • Không zoom nhỏ được trong cad

  • Khe nứt san andreas vietsub

  • x