Tạo file trong c++
Chào các bạn đang theo dõi khóa đà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 này, chúng ta sẽ cùng tìm hiểu về các khái niệm về file và phương pháp để 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 chúng ta có USB hoặc ngẫu nhiên thiết bị lưu trữ nào thì có thể chắn chúng ta đã 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ự đầu. Khi chúng ta cài đặt cấu hình cho 1 phần mềm và tắt đi, thông số kỹ thuật đó được lưu giữ vào File nhằm lần thao tác làm việc tiếp theo đang sử dụng. Hay khi chúng ta biên dịch một chương trình C++ trên Visual Studio 2015, C++ Compiler của Visual studio đang đọc mã nguồn chúng ta đã viết trong các file *.sofaxuong.vn để đánh giá lỗi với dịch chúng sang tệp tin *.obj. Trong cả hệ quản lý và điều hành Windows mà chúng ta đang sử dụng cũng là tập hợp của khá nhiều file được lưu lại trữ phía bên trong phân vùng ổ đĩa cần sử dụng cho Hệ điều hành...
Đó là một trong vài ví dụ cho biết thêm sự tồn tại của file trong lắp thêm tính. Vậy thì bọn họ đã thao tác làm việc với số đông File đó như thế nào?
Làm vấn đề với File họ chỉ tất cả các thao tác làm việc cơ bản như: tạo ra file mới, đọc dữ liệu trong file, ghi dữ liệu vào file, xóa file... Và chúng ta làm điều đó hằng ngày, khi họ chơi game, khi xem phim trên trang bị tính, ... Và trong cả khi chúng ta lập trình, mã nguồn của họ được lưu giữ xuống tệp tin mã nguồn khi nhấn tổ 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 sản phẩm tính.
Cũng y như việc lưu trữ dữ liệu trong thời điểm tạm thời trên RAM, file cũng tàng trữ dữ liệu bên dưới dạng nhị phân (0 hoặc 1), mặc dù tùy vào format của file với cách thay đổi của mỗi ứng dụng đọc tệp tin mà bọn họ có phần đa kiểu tin tức khác nhau. Ví dụ file .png thì được đưa về mẫu thiết kế ảnh, phần mềm Microsoft Word chuyển dãy bit nhị phân về dạng text...
Trong ngôn ngữ lập trình C/C++: file là thứ hạng đối tượng, nó khẳng định một stream cùng chứa những thông tin quan trọng để điều khiển, gồm một con trỏ trỏ đến buffer của nó, những chỉ mục cùng trạng thái của nó.
Các chúng ta cũng có thể hiểu tệp tin (trong ngôn ngữ lập trình C/C++) là một kiểu đối tượng người tiêu dùng mà thông qua nó bạn cũng có thể thao tác với tài liệu được lưu lại trữ phía bên trong File (chứ không phải là 1 trong những File trên sản phẩm 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 có mang trong tủ sách cstdio (hay stdio.h) mà gồm thể chúng ta đã từng học tập trong ngữ điệu C. Bọn họ sẽ học cách sử dụng những Stream để làm việc với file vắt vì sử dụng kiểu tài liệu FILE trong các bài học tập sau, mà lại mình nghĩ về kiểu dữ liệu FILE trong thư viện cstdio cũng có thể có những điểm mạnh riêng của nó buộc phải mình không quăng quật qua bài học kinh nghiệm này.
Làm bài toán với file type trong C/C++
Trong bài học kinh nghiệm này, mình sẽ hướng dẫn các bạn thực hiện tại các làm việc như mở file, đọc cùng ghi tài liệu trong file... Bọn họ cần làm việc trên một file rõ ràng nào đó bắt buộc mình sẽ khởi tạo một tệp tin với tên file là my_document.txt trong thư mục Desktop có đường truyền trên trang bị mình là: C:/Users/ADMIN/Desktop/my_document.txt
Để thao tác làm việc với file, chúng ta cần biết địa chỉ của tệp tin (thông qua con đường dẫn) để bé trỏ thứ hạng FILE rất có thể tạo được luồng dữ liệu giữa người dùng và tệp tin trên lắp thêm lưu trữ.
#include
FILE* fopen(const char *file, const char *mode);Hàm fopen cho phép tạo một kết nối đến tệp tin với băng thông được tàng trữ bởi tham số vật dụng nhất. Nếu file không tồn tại, file new sẽ được tạo nên với tên tệp tin như trong đường dẫn. Tham số sản phẩm công nghệ hai xác định kiểu truy vấn vào file. Bảng dưới đây liệt kê các mode dùng để mở một file trong C:

Nếu mở file thành công, một địa chỉ cửa hàng của một đối tượng người dùng kiểu FILE sẽ tiến hành trả về. Ví như 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 mở cửa 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ở tệp tin đã tạo sẵn trong thư mục Desktop với mode "r" (chỉ dùng làm đọc dữ liệu).
Các các bạn cần lưu ý rằng file trong máy tính tồn tại ở cả hai dạng: tệp tin văn phiên bản và file bị mã hóa.
File văn bản là phần đông file mà lại các bạn cũng 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 hầu hết định dạng dùng cho văn bản khác).
File bị mã hóa (thường gọi là file nhị phân) quan trọng đọc được lúc mở tệp tin bằng những trình biên soạn thảo văn bản. Thực hiện File bị mã hóa giúp họ bảo mật dữ liệu tốt hơn file văn bản.
Các mode mà tôi đã liệt kê ở bảng trên chỉ dùng để thao tác với file văn bản. Khi thao tác 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 tức thì sau mode mà các bạn chọn. Ví dụ: "rb", "wb", "ab", "rb+", "r+b", ...
Close fileSau khi làm việc với tệp tin xong, chúng ta cần đóng file lại nhằm tránh số đông lỗi phân phát sinh bên cạnh ý 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ữ add của đối tượng người tiêu dùng FILE đang mở. Nếu đóng file thành công xuất sắc thì trả về cực 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 open this file" << std::endl;elsestd::cout << "File is opened" << std::endl;fclose(file);Hàm fclose đã giải phóng toàn bộ dữ liệu không được xử lý trên file nếu chúng vẫn còn đấy lưu trong 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 sử dụng FILE sử dụng.
Write data to fileCác chúng ta đã triển khai được làm việc mở với đóng file, cơ mà lúc này, tệp tin mới tạo nên vẫn chưa tồn tại dữ liệu đề nghị mình đang 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ó các 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, bọn họ nên tách bóc thao tác ghi tệp tin ra một hàm riêng bao gồm dạng:
void writeToFile(FILE *file);Hàm này sẽ được gọi sau thời điểm mở file 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ờ, chúng ta chỉ suy nghĩ nội dung bên trong hàm writeToFile.
Để ghi tài liệu vào file, họ có các hàm đang được có mang sẵn trong thư viện cstdio như sau:
fputc:
int fputc(int c, tệp tin *f);Hàm fputc vẫn ghi ký tự có mã ASCII là c vào tệp tin được trỏ đến bởi con trỏ f. Quý hiếm trả về là EOF trường hợp ghi tài liệu thất bại, trả về mã ASCII của kí tự được ghi vào nếu triển khai 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 lịch trình xong, các bạn mở file my_document.txt trên Desktop lên vẫn thấy kí tự "A" đã có ghi vào, đôi khi trên console cũng in ra mã ASCII của kí từ bỏ "A".
fputs:
int fputs(const char *str, file *f);Hàm fputs ghi một C-Style string vào file được trỏ cho bởi bé trỏ f cho đến khi chạm mặt kí từ bỏ " ".
Ví dụ:
void writeToFile(FILE *file)int c = fputs("hello", file);Sau lúc chạy chương trình, các bạn mở file my_document.txt ngơi nghỉ thư mục Desktop đã thấy kí từ bỏ "A" lúc nãy không thể nữa, núm vào chính là chuỗi kí trường đoản cú "hello".
Xem thêm: Bản Chất Tia X Có Cùng Bản Chất Với Tia Nào, Tia X Có Cùng Bản Chất Với Tia Nào Sau Đây
Đầu tiên mình sẽ tạo nên một hàm khác mang tên là readFromFile như sau:
void readFromFile(FILE *file)//read dataĐể làm các ví dụ trong phần này, mình sẽ hotline hàm này sau khi đã hotline 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 họ được mở nhằm vừa đọc với ghi file, bắt buộc 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 thư viện cstdio hỗ trợ chúng ta đọc tài 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ự vào file, internal file position indicator đã chuyển mang lại kí trường đoản cú tiếp theo. Giá trị 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 phát âm từ tệp tin ra (n - 1) kí tự, bài toán đọc dữ liệu sẽ ảnh hưởng dừng nếu hiểu được kí tự new line " " hoặc EOF. Chuỗi kí tự đọc được sẽ lưu vào vùng lưu giữ được cai quản bởi nhỏ trỏ buf, nếu đọc dữ liệu thành công thì trả về địa chỉ cửa hàng 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ả hiểu file được lưu vào mảng kí từ str.
Reposition stream position indicatorGhép những ví dụ sinh hoạt trên lại, bọn họ có một chương trình dễ dàng minh họa cho việc ghi file và đọc từng dòng tài liệu (line by line) đã có được ghi vào tệp tin như sau:
#include
Nguyên nhân là khi họ gọi hàm writeToFile với truyền vào đó bé trỏ file, câu hỏi ghi file đã khiến internal tệp tin position indicator trỏ đến vị trí cuối cùng trong file. Sau khi quay quay lại hàm main, chúng ta tiếp tục call hàm readFromFile với cùng một con trỏ file. Như vậy, lúc họ đọc tệp tin thì chúng ta lại bước đầu đọc tại vị trí chấm dứt file.
Để khắc phục và hạn chế điều này, chúng ta cần đóng bé trỏ tệp tin lại cùng mở chế tác một link mới bởi hàm fopen cùng với mode dùng để đọc file. Tuy nhiên, làm vậy nên thì code xử lý của chúng ta sẽ nhiều năm hơn. Tủ sách cstdio đã cung ứng cho bọn họ hàm fseek để thay đổi vị trí trỏ mang lại trong tệp tin 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 người tiêu dùng FILE đang mở.
offset là số bytes được thêm vào đó tính từ địa điểm origin.
origin là địa điểm đặt con trỏ vào file:

Như vậy, sau thời điểm gọi hàm writeToFile xong, họ cần dịch rời internal tệp tin position indicator về đầu file bằng phương pháp 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 tựa như những gì bọn họ đã ghi vào file.
Determine form size of content of fileĐôi khi họ cần đọc toàn bộ nội dung của file vào trong 1 vùng ghi nhớ trên Heap, họ sẽ cần phải biết trước kích thước nội dung tất cả trong tệp tin để cấp phép đủ vùng nhớ trước lúc đọc file. Thư viện cstdio chỉ cung ứng cho họ hàm ftell:
long int ftell(FILE *f);Hàm này đã trả về địa điểm của tệp tin indicator đang trỏ mang lại trong tệp tin (số bytes của câu chữ file mà lại indicator đã chăm sóc qua).
Như vậy, các chúng ta có thể đọc kích thước của câu chữ trong file bằng cách dịch internal tệp tin position indicator về vị trí ở đầu cuối trong file rồi gọi 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 đó là 2 hàm dùng làm đọc cùng ghi tài liệu chỉ 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 để ghi hàng bit vào vùng ghi nhớ được cai quản bởi con trỏ ptr vào file đang rất được trỏ vì f, kích cỡ là số bytes đã copy trường đoản cú vùng ghi nhớ của ptr cùng count là số lần ghi vùng nhớ kia xuống file.
Hàm fwrite không nhiệt tình vùng ghi nhớ của các bạn có định dạng gì, nó quan lại tâm size vùng nhớ đề xuất đọc với cứ thế copy tất cả các bits và 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 đã copy count lần block of bits có kích cỡ là size, chuyển vào vùng ghi nhớ được trỏ đến vì ptr, tự file vẫn được quản lý bởi f.
Sau khi gọi hàm fread, internal tệp tin position indicator sẽ dịch chuyển tới (size * count) bytes từ vị trí bắt đầu đọc file.
Ví dụ:
#include
Như các bạn thấy, hàm fread gọi đúng 255 bytes vào file để lấy vào vùng ghi nhớ của ptr nên các giá trị vượt xuất hiện. Vào trường thích hợp này, sử dụng hàm fread với fwrite không phù hợp. Hàm fread cùng fwrite hay được dùng để làm đọc và ghi dữ liệu kiểu struct vào file.
Write và read structsMình vẫn giữ lại nguyên cấu tạo chương trinh như trên và chỉ đổi khác code vào hàm writeToFile với readFromFile.
Trước hết, mình chế tạo ra một struct đơ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 buộc phải 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). Bởi thế là mỗi unit tất cả kiểu Employee được tạo thành đều chiếm phần một vùng lưu giữ có kích thước 56 bytes.
Các chúng ta thử tưởng tượng nếu bọn họ sử dụng những hàm ghi tệp tin như fputs, fprintf... Thì size tên của mọi cá nhân sẽ khác biệt dẫn đến bọn họ không bao gồm một định dạng tầm thường để dễ làm chủ nhiều Employee trong file. Vấn đề đặt chúng vào trong 1 struct giúp chúng ta đọc và ghi file dễ dãi hơn nhiều.
Xem thêm: Giáo Dục Công Dân 9 Bài 1 : Chí Công Vô Tư, Bài 1: Chí Công Vô Tư
Dưới đây là một đoạn chương trình chủng loại cho câu hỏi xử lý file để quản lý 3 Employee:
#include
Bây giờ họ cùng mở file my_document.txt trong folder Desktop để xem thử nội dung trong file như thế nào: