Làm việc với file trong c

Chào các bạn đã theo dõi và quan sát khóa huấn luyện lập trình trực đường ngôn ngữ C++.

Bạn đang xem: Làm việc với file trong c

Trong bài học kinh nghiệm này, chúng ta sẽ cùng khám phá về những quan niệm về File và phương pháp để làm việc cùng với File vào ngôn ngữ lập trình C/C++.

File

Nếu máy vi tính của chúng ta bao gồm ổ cứng, hoặc chúng ta tất cả USB hoặc ngẫu nhiên sản phẩm công nghệ lưu trữ làm sao thì chắc chắn rằng các bạn đã từng làm việc với File. khi chúng ta chơi một game offline, thông báo nhân vật dụng, điểm số, ... sẽ được lưu trữ trong File nhằm lúc công tác game bị tắt đi thì chúng ta không hẳn nghịch lại từ đầu. khi các bạn setup thông số kỹ thuật mang lại một trong những phần mềm và tắt đi, cấu hình này được lưu lại vào File để lần làm việc tiếp theo sẽ áp dụng. Hay lúc chúng ta biên dịch một lịch trình C++ trên Visual Studio 2015, C++ Compiler của Visual studio đã gọi mã mối cung cấp các bạn đang viết trong số tệp tin *.myphammioskin.com.vn nhằm chất vấn lỗi với dịch chúng quý phái tệp tin *.obj. ngay khi hệ điều hành và quản lý Windows cơ mà các bạn đã thực hiện cũng là tập hòa hợp của không ít tệp tin được lưu trữ phía bên trong phân vùng ổ đĩa sử dụng mang lại Hệ điều hành quản lý...

Đó là một vài ví dụ cho biết sự lâu dài của File trong laptop. Vậy thì chúng ta sẽ thao tác làm việc cùng với những File đó như thế nào?

Làm Việc cùng với File họ chỉ tất cả các thao tác cơ phiên bản như: tạo nên tệp tin bắt đầu, hiểu dữ liệu vào file, ghi dữ liệu vào tệp tin, xóa file... Và chúng ta làm cho điều đó hàng ngày, khi bọn họ chơi trò giải trí, khi xem phim trên laptop, ... với trong cả khi họ xây dựng, mã nguồn của chúng ta được lưu lại xuống File mã nguồn khi thừa nhận tổng hợp phím Ctrl + S.

Theo quan niệm trên Wikipedia về computer file: Một file bên trên máy tính xách tay là 1 trong tài ngulặng dùng để tàng trữ công bố lâu dài hơn, thực hiện cho những công tác máy tính xách tay.

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

Trong ngôn từ thiết kế C/C++: File là loại đối tượng người sử dụng, nó xác định một stream và chứa những ban bố quan trọng nhằm điều khiển, gồm một nhỏ trỏ trỏ mang đến buffer của nó, các chỉ mục và tinh thần của nó.

Các bạn có thể gọi File (vào ngôn từ lập trình C/C++) là một trong hình dáng đối tượng người sử dụng cơ mà thông qua nó chúng ta cũng có thể thao tác làm việc với tài liệu được tàng trữ bên trong File (chứ chưa hẳn là một trong File bên trên lắp thêm tính).

Để chúng ta không biến thành lầm lẫn, bản thân đang nói đến kiểu dáng tài liệu FILE được tư tưởng vào thư viện cstdio (tuyệt stdio.h) nhưng mà hoàn toàn có thể chúng ta đã từng học trong ngôn từ C. Chúng ta đang học tập cách thực hiện những Stream để thao tác làm việc với file vậy vị áp dụng loại dữ liệu FILE trong các bài học kinh nghiệm sau, tuy vậy bản thân suy nghĩ loại tài liệu FILE vào tlỗi viện cstdio cũng đều có những điểm mạnh riêng của nó yêu cầu bản thân không bỏ lỡ bài học này.

Làm bài toán cùng với FILE type trong C/C++

Trong bài học này, mình vẫn lí giải các bạn tiến hành những thao tác làm việc như msống tệp tin, đọc với ghi tài liệu vào tệp tin... Chúng ta nên làm việc bên trên một tệp tin cụ thể như thế nào kia yêu cầu bản thân sẽ tạo nên một tệp tin cùng với tên file là my_document.txt trong thỏng mục Desktop bao gồm đường truyền bên trên thứ mình là: C:/Users/ADMIN/Desktop/my_document.txt

Để thao tác với tệp tin, bọn họ cần phải biết địa chỉ của file (trải qua đường dẫn) nhằm nhỏ trỏ phong cách FILE rất có thể tạo ra luồng tài liệu giữa người tiêu dùng với file bên trên sản phẩm công nghệ tàng trữ.

#include #include int main()const char *filePath = "C:/Users/ADMIN/Desktop/my_document.txt";FILE *file;return 0;mở cửa fileĐể mở 1 tệp tin, các bạn có thể thực hiện hàm fopen được khái niệm trong tlỗi viện cstdio:

FILE* fopen(const char *tệp tin, const char *mode);Hàm fopen chất nhận được chế tác một liên kết mang lại tệp tin cùng với đường truyền được lưu trữ bởi tđê mê số thứ nhất. Nếu tệp tin không mãi sau, tệp tin bắt đầu sẽ được tạo nên cùng với tên file như trong đường dẫn. Tham mê số vật dụng nhị khẳng định đẳng cấp truy cập vào tệp tin. Bảng sau đây liệt kê các mode dùng để làm mtại một file vào C:


*

Nếu mlàm việc tệp tin thành công, một can hệ của một đối tượng người tiêu dùng hình trạng FILE sẽ tiến hành trả về. Nếu msống file thua cuộc 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 open this file" << std::endl;elsestd::cout << "File is opened" << std::endl;Trong đoạn công tác bên trên, mình msinh hoạt tệp tin đang chế tạo ra sẵn vào thỏng mục Desktop với mode "r" (chỉ dùng làm phát âm dữ liệu).

Các bạn cần xem xét rằng file vào máy tính vĩnh cửu ở 2 dạng: file văn bản và file bị mã hóa.

File văn bạn dạng là hồ hết file mà lại các chúng ta có thể phát âm được khi mnghỉ ngơi bằng các trình soạn thảo văn uống phiên bản, thông thường gần như file này được định dạng Unicode (hoặc đầy đủ format dùng đến vnạp năng lượng bản khác).

File bị mã hóa (thường gọi là file nhị phân) không thể hiểu được Khi msinh hoạt tệp tin bởi những trình biên soạn thảo văn bạn dạng. Sử dụng File bị mã hóa góp họ bảo mật thông tin tài liệu xuất sắc hơn File văn uống bản.

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

Cthua file

Sau Lúc thao tác với tệp tin kết thúc, chúng ta nên đóng góp tệp tin lại để tách phần lớn lỗi phát sinh xung quanh ý mong muốn. Để đóng file, họ thực hiện hàm fclose:

int fclose(FILE *file);Trong số đó, file là bé trỏ được dùng làm lưu trữ liên can của đối tượng người dùng FILE sẽ mlàm việc. Nếu đóng tệp tin thành công xuất sắc thì trả về quý hiếm 0, ngược chở lại trả về EOF (End of file).

const char *filePath = "C:/Users/ADMIN/Desktop/my_document.txt";FILE *file;tệp tin = 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 fcđại bại đang giải pngóng tất cả tài liệu không được xử lý trên file trường hợp chúng vẫn tồn tại giữ trong buffer, đóng tệp tin lại, với giải pchờ toàn khu vực ghi nhớ mà lại đối tượng người tiêu dùng FILE thực hiện.

Write data to lớn file

Các bạn đang tiến hành được thao tác mở cùng đóng góp tệp tin, tuy thế hôm nay, file bắt đầu tạo ra vẫn chưa có dữ liệu bắt buộc mình đã triển khai thao tác làm việc ghi dữ liệu vào tệp tin trước. Để msống tệp tin mang đến cơ chế ghi tệp tin, chúng ta có những mode "w", "r+", "w+", "a", "a+". Mình chỉ muốn ghi tài liệu cần mình vẫn lựa chọn mode "w".

Nhưng trước tiên, họ nên tách thao tác làm việc ghi file ra một hàm riêng biệt có dạng:

void writeToFile(FILE *file);Hàm này sẽ tiến hành call sau khi msống tệp tin cùng trước khi đóng góp tệp tin.

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ờ, bọn họ chỉ quan tâm mang lại nội dung bên trong hàm writeToFile.

Để ghi dữ liệu vào tệp tin, bọn họ có các hàm đã có được có mang sẵn vào thư viện cstdio nlỗi sau:

fputc:

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

Ví dụ:

void writeToFile(FILE *file)int c = fputc("A", file);std::cout << c << std::endl;Sau khi chạy chương trình kết thúc, chúng ta mở file my_document.txt bên trên Desktop lên vẫn thấy kí tự "A" đã làm được ghi vào, đồng thời bên 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 tệp tin được trỏ đến bởi con trỏ f cho tới lúc chạm mặt kí trường đoản cú "".

Ví dụ:

void writeToFile(FILE *file)int c = fputs("hello", file);Sau Khi chạy chương trình, chúng ta msống file my_document.txt sống tlỗi mục Desktop sẽ thấy kí từ "A" dịp nãy không còn nữa, cố kỉnh vào sẽ là chuỗi kí từ "hello".

Xem thêm: Phim Hay 2020 - Đóa Hoa Lưỡng Sinh Tập 4

Read data from file

trước hết bản thân sẽ tạo một hàm khác mang tên là readFromFile như sau:

void readFromFile(FILE *file)//read dataĐể làm cho những ví dụ vào phần này, mình vẫn call hàm này sau thời điểm đang Điện thoại tư vấn hàm writeToFile.

const char *filePath = "C:/Users/ADMIN/Desktop/my_document.txt";FILE *file;tệp tin = 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 bọn họ được msống nhằm vừa gọi với ghi file, nên mình đã thực hiện mode "w+" (hoặc "r+").

Và bên dưới đây là một vài hàm được tư tưởng sẵn vào thỏng viện cstdio hỗ trợ họ phát âm dữ liệu vnạp năng lượng bản từ file.

fgetc:

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

Reposition stream position indicator

Ghxay các ví dụ làm việc bên trên lại, bọn họ bao gồm một chương trình dễ dàng minch họa mang đến vấn đề ghi tệp tin và hiểu từng cái tài liệu (line by line) đã được ghi vào tệp tin nhỏng sau:

#include #include #include void writeToFile(FILE *file)for (int i = 1; i <= 5; i++)fprintf(tệp tin, "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 open 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ả đã tạo ra screen không phải như ước muốn.

Ngulặng nhân là khi họ Hotline hàm writeToFile cùng truyền vào kia bé trỏ file, việc ghi file đang khiến internal file position indicator trỏ mang đến địa điểm sau cùng trong file. Sau khi quay trở lại hàm main, bọn họ liên tục Điện thoại tư vấn hàm readFromFile với cùng 1 con trỏ file. do vậy, cơ hội chúng ta hiểu file thì bọn họ lại bắt đầu phát âm trên địa điểm xong xuôi tệp tin.

Để hạn chế và khắc phục điều đó, họ phải đóng con trỏ file lại và msinh hoạt tạo một liên kết new bằng hàm fopen cùng với mode dùng để làm gọi file. Tuy nhiên, làm điều đó thì code cách xử lý của chúng ta vẫn dài thêm hơn nữa. Thư viện cstdio vẫn cung cấp đến chúng ta hàm fseek để đổi khác địa chỉ trỏ cho trong file của internal tệp tin position indicator.

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

f là nhỏ trỏ trỏ cho đối tượng người tiêu dùng FILE đang mnghỉ ngơi.

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

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

*

Như vậy, sau khi Gọi hàm writeToFile xong xuôi, bọn họ nên di chuyển internal tệp tin position indicator về đầu file bằng cách nhỏng sau:

writeToFile(file);fseek(file, 0, SEEK_SET);readFromFile(file);Sau kia chạy lịch trình thì thấy tài liệu in ra màn hình đúng tựa như các gì họ đã ghi vào tệp tin.

Determine form size of nội dung of file

Đôi khi chúng ta buộc phải hiểu toàn bộ câu chữ của tệp tin vào một vùng ghi nhớ trên Heap, chúng ta vẫn nên biết trước kích thước văn bản có trong file nhằm cấp phát đầy đủ vùng ghi nhớ trước khi phát âm tệp tin. Thỏng viện cstdio chỉ cung ứng mang lại họ hàm ftell:

long int ftell(FILE *f);Hàm này vẫn trả về địa chỉ của tệp tin indicator sẽ trỏ đến vào file (số bytes của văn bản tệp tin nhưng indicator sẽ chăm sóc qua).

vì thế, các bạn cũng có thể phát âm kích cỡ của nội dung vào tệp tin bằng cách dịch internal tệp tin position indicator về địa chỉ cuối cùng trong file rồi Gọi hàm ftell:

__int64 size_of_file(FILE *file)fseek(tệp tin, 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 để làm gọi cùng ghi dữ liệu chỉ dùng đến 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 dãy bit trong vùng ghi nhớ được thống trị vày bé trỏ ptr vào file đang rất được trỏ bởi f, kích thước là số bytes đã copy từ bỏ vùng ghi nhớ của ptr cùng count là mốc giới hạn ghi vùng lưu giữ kia xuống tệp tin.

Hàm fwrite không quyên tâm vùng nhớ của chúng ta tất cả format gì, nó quan tâm kích cỡ vùng lưu giữ đề nghị gọi với cứ nắm copy toàn bộ những bits cùng tệp tin, các lần sẽ copy 1 bloông chồng of bit.

size_t fread(void *ptr, size_t kích cỡ, size_t count, FILE *f);Hàm fread đang copy count lần bloông xã of bits có kích thước là kích cỡ, gửi vào vùng nhớ được trỏ cho bởi vì ptr, từ bỏ file đang rất được cai quản vày f.

Sau lúc điện thoại tư vấn hàm fread, internal tệp tin position indicator đã dịch rời cho tới (size * count) bytes từ địa điểm ban đầu phát âm 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;tệp tin = 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;Chạy chương trình bên trên cho ra hiệu quả là tương đối nhiều kí trường đoản cú rác rến.

Như các bạn thấy, hàm fread phát âm đúng 255 bytes vào file để mang vào vùng nhớ của ptr nên những cực hiếm thừa xuất hiện. Trong ngôi trường thích hợp này, sử dụng hàm fread và fwrite không phù hợp. Hàm fread với fwrite thường được dùng làm gọi với ghi tài liệu hình dáng struct vào file.

Write & read structs

Mình vẫn không thay đổi cấu tạo chương trinc nhỏng trên và chỉ chuyển đổi code vào hàm writeToFile cùng readFromFile.

Trước hết, mình tạo 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 hẳn là 54 bytes bởi phương pháp tổ chức dữ liệu trong struct còn liên quan mang đến định nghĩa struct alignment). bởi vậy là từng unit tất cả hình dáng Employee được tạo nên gần như chiếm một vùng ghi nhớ gồm kích cỡ 56 bytes.

Các bạn thử tưởng tượng nếu chúng ta sử dụng các hàm ghi tệp tin như fputs, fprintf... thì kích cỡ thương hiệu của mỗi người vẫn không giống nhau dẫn mang lại họ không tồn tại một định dạng tầm thường để dễ dàng quản lý nhiều Employee vào file. Việc đặt nó vào trong 1 struct góp bọn họ gọi cùng ghi tệp tin dễ ợt rộng nhiều.

Xem thêm: Bộ Bàn Ăn Uma Sp011112 - Bộ Bàn Ghế Ăn Uma Nhập Khẩu Hoy T829

Dưới đấy là một đoạn lịch trình mẫu mã cho bài toán cách xử trí tệp tin để 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 Dinch 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(tệp tin, 0, SEEK_SET);readFromFile(file);fclose(file);return 0;Các chúng ta chạy test đoạn chương trình bên trên giúp xem công dụng.

Bây tiếng chúng ta cùng msinh hoạt file my_document.txt vào thỏng mục Desktop giúp thấy test văn bản vào file như vậy nào:


Chuyên mục: Blogs