Tạo file trong c++

     

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

Bạn đang xem: Tạo file trong c++

Trong bài học kinh nghiệm này, bọn họ sẽ cùng khám phá về những khái niệm về file và cách để thao tác với tệp tin trong ngữ điệu 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 các bạn có USB hoặc bất kỳ thiết bị lưu trữ nào thì chắc chắn chắn chúng ta đã từng thao tác với File. Khi chúng ta chơi một trò chơi offline, thông tin nhân vật, điểm số, ... Sẽ được lưu trữ vào File để khi chương trình game bị tắt đi thì chúng ta không nên chơi lại từ bỏ đầu. Khi các bạn cài đặt thông số kỹ thuật cho một trong những phần mềm với tắt đi, cấu hình đó được giữ vào File nhằm lần thao tác tiếp theo đang sử dụng. Giỏi khi các bạn biên dịch một chương trình C++ bên trên Visual Studio 2015, C++ Compiler của Visual studio sẽ đọc mã nguồn chúng ta đã viết trong những file *.cameraquansat24h.vn để khám nghiệm lỗi cùng dịch chúng sang tệp tin *.obj. Ngay cả hệ điều hành quản lý Windows mà các bạn đang áp dụng cũng là tập hợp của không ít file được lưu trữ bên trong phân vùng ổ đĩa cần sử dụng cho Hệ điều hành...

Đó là một vài ví dụ cho biết sự trường thọ của tệp tin trong máy tính. Vậy thì bọn họ đã làm việc với hầu như File đó như thế nào?

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

Theo định nghĩa trên Wikipedia về computer file: Một file trên laptop là một tài nguyên dùng để làm 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 hệt như việc tàng 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 dạng của file và cách biến hóa của mỗi ứng dụng đọ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, phần mềm Microsoft Word gửi dãy bit nhị phân về dạng text...

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

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

Để chúng ta không bị nhầm lẫn, bản thân đang nói đến kiểu dữ 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 tập trong ngôn từ C. Bọn họ sẽ học biện pháp sử dụng những Stream để thao tác làm việc với file thay vì sử dụng kiểu tài liệu FILE trong số bài học tập sau, dẫu vậy mình suy nghĩ kiểu tài liệu FILE trong tủ sách cstdio cũng có thể có những ưu điểm riêng của nó buộc phải mình không bỏ qua bài học này.

Làm vấn đề với tệp tin type trong C/C++

Trong bài học này, mình đang hướng dẫn chúng ta thực hiện tại các thao tác làm việ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 đó yêu cầu mình sẽ tạo một tệp tin với tên tệp tin là my_document.txt trong folder Desktop có đường dẫn trên sản phẩm công nghệ mình là: C:/Users/ADMIN/Desktop/my_document.txt

Để thao tác làm việc với file, bọn họ cần biết địa chỉ của tệp tin (thông qua đường dẫn) để con trỏ đẳng cấp FILE có thể tạo được luồng tài liệu giữa người tiêu dùng và tệp tin trên trang bị 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 bạn có thể sử dụng hàm fopen được khái niệm trong thư viện cstdio:

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


*

Nếu mở tệp tin thành công, một địa chỉ cửa hàng của một đối tượng người sử dụng kiểu FILE sẽ được trả về. Nếu mở file chiến bại 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 chương trình trên, mình mở file đã chế tạo ra sẵn trong folder Desktop với mode "r" (chỉ dùng để đọc dữ liệu).

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

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

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

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

Close file

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

int fclose(FILE *file);Trong đó, tệp tin là nhỏ trỏ được dùng để làm lưu trữ add của đối tượng FILE đã mở. Nếu đóng file thành công xuất sắc thì trả về quý giá 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 sẽ giải phóng toàn bộ dữ liệu không được xử lý trên file nếu chúng vẫn tồn tại lưu vào buffer, đóng góp file lại, cùng giải phóng tất cả khu vực nhớ mà đối tượng người dùng FILE sử dụng.

Write data lớn file

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

Nhưng trước hết, chúng ta nên bóc thao tác ghi file ra một hàm riêng gồm dạng:

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

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);fclose(file);Bây giờ, họ chỉ lưu ý đến nội dung phía bên trong hàm writeToFile.

Để ghi tài liệu vào file, bọn họ có các hàm đã được tư tưởng sẵn trong thư viện cstdio như sau:

fputc:

int fputc(int c, file *f);Hàm fputc vẫn ghi ký kết tự gồm mã ASCII là c vào tệp tin được trỏ đến bởi bé trỏ f. Giá trị trả về là EOF nếu ghi tài liệu thất bại, trả về mã ASCII của kí từ được ghi vào nếu tiến hành thành công.

Ví dụ:

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

fputs:

int fputs(const char *str, tệp tin *f);Hàm fputs ghi một C-Style string vào tệp tin được trỏ đến bởi nhỏ trỏ f cho tới khi chạm chán kí tự "".

Ví dụ:

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

Xem thêm: Giải Địa Lý Lớp 7 Bài 28: Thực Hành: Phân Tích Lược Đồ Phân Bố Các Môi Trường Tự Nhiên, Biểu Đồ Nhiệt Độ Và Lượng Mưa Ở Châu Phi

Read data from file

Đầu tiên mình sẽ tạo một hàm khác mang 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ẽ gọi hàm này sau thời điểm đã điện thoại tư vấn 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, file của bọn họ được mở để vừa đọc cùng ghi file, yêu cầu mình sẽ áp dụng mode "w+" (hoặc "r+").

Và dưới đó là một số hàm được tư tưởng sẵn trong tủ sách cstdio hỗ trợ chúng ta đọc dữ liệu văn bạn dạng từ file.

fgetc:

int fgetc(FILE *f);Hàm fgetc hiểu ra một kí tự trong file, internal tệp tin position indicator đã chuyển mang đến kí từ tiếp theo. Quý giá trả về là mã ASCII của kí tự sẽ đọ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 hiểu từ file ra (n - 1) kí tự, vấn đề đọc dữ liệu có khả năng sẽ bị dừng nếu gọi được kí từ bỏ new line " " hoặc EOF. Chuỗi kí tự phát âm được sẽ lưu vào vùng lưu giữ được làm chủ bởi bé trỏ buf, nếu phát âm dữ liệu thành công thì trả về địa chỉ của buf, ngược 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ừ bỏ str.

Reposition stream position indicator

Ghép những ví dụ làm việc trên lại, chúng ta có một chương trình đơn giản dễ dàng minh họa cho việc ghi file và đọc từng dòng dữ liệu (line by line) đã được ghi vào tệp tin 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, tác dụng cho ra màn hình không phải như mong muốn.

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

Để hạn chế điều này, họ cần đóng bé trỏ file lại và mở chế tạo ra một liên kết mới bởi hàm fopen cùng với mode dùng làm đọc file. Mặc dù nhiên, làm do đó thì code xử trí của bọn họ sẽ lâu năm hơn. Thư viện cstdio đã cung cấp cho bọn họ hàm fseek để biến hóa vị trí trỏ đến trong tệp tin của internal tệp tin position indicator.

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

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

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

origin là vị trí đặt con trỏ vào file:

*

Như vậy, sau khoản thời gian gọi hàm writeToFile xong, họ cần dịch rời internal tệp tin 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 hiển thị đúng giống như những gì bọn họ đã ghi vào file.

Determine kích cỡ of content of file

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

long int ftell(FILE *f);Hàm này sẽ trả về địa chỉ của tệp tin indicator vẫn trỏ cho trong tệp tin (số bytes của câu chữ file nhưng mà indicator đã chu đáo qua).

Như vậy, các bạn có thể đọc kích cỡ của ngôn từ trong file bằng phương pháp dịch internal tệp tin position indicator về vị trí sau cuối trong tệp tin rồi call hàm ftell:

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

size_t fwrite(const void *ptr, size_t size, size_t count, tệp tin *f);Hàm fwrite dùng làm ghi dãy bit vào vùng lưu giữ được thống trị bởi con trỏ ptr vào file đang rất được trỏ vày f, size là số bytes đang copy trường đoản cú vùng ghi nhớ của ptr và count là chu kỳ ghi vùng nhớ kia xuống file.

Hàm fwrite không đon đả vùng ghi nhớ của các bạn có format gì, nó quan tâm form size vùng nhớ đề xuất đọc cùng cứ rứa copy toàn bộ các bits cùng file, các lần sẽ copy 1 block of bit.

size_t fread(void *ptr, size_t size, size_t count, tệp tin *f);Hàm fread sẽ copy count lần block of bits có kích cỡ là size, đưa vào vùng lưu giữ được trỏ đến bởi ptr, từ bỏ file đã được cai quản bởi f.

Sau khi gọi hàm fread, internal tệp tin position indicator sẽ di chuyển tới (size * count) bytes từ bỏ vị trí ban đầ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 lịch trình trên mang đến ra kết quả là không hề ít kí từ bỏ rác.

Như các bạn thấy, hàm fread đọc đúng 255 bytes vào file để lấy vào vùng ghi nhớ của ptr nên các giá trị thừa xuất hiện. Trong trường vừa lòng này, dùng hàm fread và fwrite không phù hợp. Hàm fread và fwrite thường được dùng để đọc cùng ghi dữ liệu kiểu struct vào file.

Write and read structs

Mình vẫn duy trì nguyên cấu tạo chương trinh như trên và chỉ thay đổi code vào hàm writeToFile cùng readFromFile.

Trước hết, mình sinh sản 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 đề xuất là 54 bytes vị cách tổ chức triển khai dữ liệu trong struct còn tương quan đến tư tưởng struct alignment). Vì vậy là từng unit có kiểu Employee được tạo thành đều chiếm phần một vùng lưu giữ có kích cỡ 56 bytes.

Các các bạn thử tưởng tượng nếu chúng ta sử dụng những hàm ghi tệp tin như fputs, fprintf... Thì size tên của mọi người sẽ không giống nhau dẫn đến chúng ta không tất cả một định dạng chung để dễ thống trị nhiều Employee vào file. Câu hỏi đặt chúng vào trong 1 struct giúp chúng ta đọc với ghi file dễ ợt hơn nhiều.

Xem thêm: Hình Học 9 Một Số Hệ Thức Về Cạnh Và Đường Cao Trong Tam Giác Vuông

Dưới đây là một đoạn chương trình chủng loại cho câu hỏi xử lý file để cai quản 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 open 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 test đoạn chương trình trên giúp thấy kết quả.

Bây giờ chúng ta cùng mở tệp tin my_document.txt trong folder Desktop giúp thấy thử văn bản trong file như thế nào: