Cách đọc file trong c++

     

Chào chúng ta đã theo dõi khóa học xây dựng trực tuyến ngôn ngữ C++.

Bạn đang xem: Cách đọc file trong c++

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

Đó là 1 vài ví dụ cho thấy thêm sự mãi mãi của File trong máy tính xách tay. Vậy thì họ đang làm việc cùng với hồ hết File đó như vậy nào?

Làm câu hỏi với File bọn họ chỉ tất cả những thao tác làm việc cơ bản như: tạo thành tệp tin mới, phát âm dữ liệu trong tệp tin, ghi tài liệu vào file, xóa tệp tin... Và họ có tác dụng điều này mỗi ngày, khi bọn họ chơi trò giải trí, lúc xem phyên trên máy tính xách tay, ... cùng ngay cả Khi họ lập trình sẵn, mã nguồn của chúng ta được giữ xuống File mã nguồn Khi dấn tổng hợp phím Ctrl + S.

Theo khái niệm trên Wikipedia về computer file: Một tệp tin bên trên máy vi tính là một trong tài nguim dùng để làm tàng trữ đọc tin dài lâu, thực hiện cho những lịch trình máy vi tính.

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

Trong ngữ điệu lập trình sẵn C/C++: File là mẫu mã đối tượng người tiêu dùng, nó khẳng định một stream và cất các biết tin quan trọng để điều khiển và tinh chỉnh, bao gồm 1 con trỏ trỏ mang đến buffer của nó, các chỉ mục và tâm lý của nó.

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

Để chúng ta không trở nên nhầm lẫn, bản thân vẫn nói tới giao diện dữ liệu FILE được định nghĩa trong thỏng viện cstdio (xuất xắc stdio.h) cơ mà hoàn toàn có thể các bạn đã có lần học tập trong ngữ điệu C. Chúng ta đang học bí quyết thực hiện những Stream nhằm thao tác làm việc với tệp tin gắng bởi vì sử dụng hình dạng dữ liệu FILE trong số bài học kinh nghiệm sau, mà lại mình nghĩ về kiểu dáng tài liệu FILE trong thư viện cstdio cũng có thể có số đông điểm mạnh riêng của chính nó phải mình ko bỏ qua bài học này.

Làm vấn đề cùng với FILE type vào C/C++

Trong bài học kinh nghiệm này, bản thân đã lí giải chúng ta thực hiện các thao tác nlỗi msinh sống file, hiểu và ghi tài liệu trong tệp tin... Chúng ta cần thao tác trên một tệp tin ví dụ như thế nào đó buộc phải mình sẽ tạo nên một tệp tin cùng với tên tệp tin là my_document.txt vào thư mục Desktop có đường truyền trên sản phẩm bản thân là: C:/Users/ADMIN/Desktop/my_document.txt

Để làm việc với tệp tin, bọn họ nên biết địa chỉ của file (thông qua con đường dẫn) nhằm nhỏ trỏ thứ hạng FILE hoàn toàn có thể tạo ra luồng tài liệu giữa người tiêu dùng và file bên trên trang bị tàng trữ.

#include #include int main()const char *filePath = "C:/Users/ADMIN/Desktop/my_document.txt";FILE *file;return 0;Open fileĐể mtại 1 tệp tin, những chúng ta cũng có thể sử dụng hàm fopen được khái niệm vào thư viện cstdio:

FILE* fopen(const char *tệp tin, const char *mode);Hàm fopen có thể chấp nhận được chế tạo ra một kết nối đến file cùng với đường truyền được tàng trữ vày ttê mê số trước tiên. Nếu tệp tin ko sống thọ, tệp tin mới sẽ được tạo nên với thương hiệu file như vào đường dẫn. Tmê mẩn số đồ vật hai xác định mẫu mã truy vấn vào file. Bảng sau đây liệt kê những mode dùng để làm mtại 1 tệp tin trong C:


*

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

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

File văn uống bản là các file mà lại các chúng ta có thể hiểu được lúc msống bởi các trình soạn thảo văn uống phiên bản, thông thường số đông tệp tin này được định hình Unicode (hoặc đông đảo format sử dụng mang đến văn bạn dạng khác).

File bị mã hóa (hay hotline là file nhị phân) không thể hiểu được Khi mnghỉ ngơi file bởi những trình soạn thảo văn uống bạn dạng. Sử dụng File bị mã hóa góp chúng ta bảo mật thông tin dữ liệu xuất sắc rộng File vnạp năng lượng bản.

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

Close file

Sau Khi thao tác cùng với file kết thúc, các bạn buộc phải đóng file lại để tránh phần nhiều lỗi phát sinh bên cạnh ý hy vọng. Để đóng tệp tin, họ áp dụng hàm fclose:

int fclose(FILE *file);Trong đó, file là con trỏ được dùng làm lưu trữ liên can của đối tượng FILE đã msinh hoạt. Nếu đóng góp tệp tin thành công thì trả về cực hiếm 0, ngược trở 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 fcthua trận đã giải pngóng tất cả dữ liệu không được xử lý trên file giả dụ chúng vẫn còn đấy giữ vào buffer, đóng tệp tin lại, và giải pngóng toàn vùng ghi nhớ mà lại đối tượng FILE thực hiện.

Write data khổng lồ file

Các chúng ta đã tiến hành được thao tác mlàm việc và đóng góp tệp tin, dẫu vậy bây giờ, tệp tin new tạo ra vẫn chưa xuất hiện tài liệu bắt buộc mình vẫn triển khai làm việc ghi dữ liệu vào file trước. Để mở file mang lại chính sách ghi file, chúng ta bao gồm các mode "w", "r+", "w+", "a", "a+". Mình chỉ ao ước ghi dữ liệu nên mình đang chọn mode "w".

Nhưng trước hết, bọn họ phải tách bóc làm việc ghi tệp tin ra một hàm riêng gồm dạng:

void writeToFile(FILE *file);Hàm này sẽ được Hotline sau thời điểm msinh hoạt file với trước khi đóng góp tệp tin.

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);fclose(file);Bây giờ đồng hồ, chúng ta chỉ quyên tâm đến văn bản bên phía trong hàm writeToFile.

Để ghi dữ liệu vào file, bọn họ gồm những hàm đã có tư tưởng sẵn vào thư viện cstdio nhỏng sau:

fputc:

int fputc(int c, FILE *f);Hàm fputc sẽ ghi ký kết tự gồm mã ASCII là c vào tệp tin được trỏ mang đến bởi nhỏ trỏ f. Giá trị trả về là EOF nếu ghi dữ liệu thua cuộc, trả về mã ASCII của kí trường đoản cú được ghi vào giả dụ tiến hành 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 ngừng, các bạn mlàm việc tệp tin my_document.txt bên trên Desktop lên đã thấy kí tự "A" đã được ghi vào, bên cạnh đó 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ỏ đến vì chưng bé trỏ f cho đến Lúc gặp gỡ 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 mnghỉ ngơi file my_document.txt ở tlỗi mục Desktop vẫn thấy kí từ bỏ "A" thời điểm nãy không hề nữa, gắng vào đó là chuỗi kí từ "hello".

Xem thêm: Trạm Phát Wi Fi Cho Android, Kết Nối Wifi Trên Điện Thoại, Cách Phát Wifi Trên Điện Thoại Android

Read data from file

Trước hết mình sẽ tạo một hàm khác có tên là readFromFile nlỗi sau:

void readFromFile(FILE *file)//read dataĐể làm các ví dụ vào phần này, mình đã 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);Trong thời điểm này, file của chúng ta được mlàm việc nhằm vừa gọi với ghi tệp tin, cần bản thân sẽ sử dụng mode "w+" (hoặc "r+").

Và bên dưới đấy là một số trong những hàm được có mang sẵn vào tlỗi viện cstdio hỗ trợ bọn họ gọi tài liệu vnạp năng lượng bạn dạng tự tệp tin.

fgetc:

int fgetc(FILE *f);Hàm fgetc đọc ra một kí tự trong tệp tin, internal tệp tin position indicator sẽ gửi mang lại kí trường đoản cú tiếp theo. Giá trị trả về là mã ASCII của kí từ bỏ đã phát âm đượ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 trường đoản cú tệp tin ra (n - 1) kí từ, Việc hiểu dữ liệu có khả năng sẽ bị ngừng 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ú phát âm được sẽ lưu lại vào vùng nhớ được quản lý vì con trỏ buf, giả dụ phát âm tài liệu thành công xuất sắc thì trả về liên quan của buf, trở 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 trái hiểu file được giữ vào mảng kí từ str.

Reposition stream position indicator

Ghép các ví dụ làm việc trên lại, chúng ta gồm một lịch trình dễ dàng minh họa cho việc ghi file và hiểu từng mẫu dữ liệu (line by line) đã được ghi vào file nlỗi 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, tác dụng cho ra screen không phải như mong ước.

Ngulặng nhân là khi họ hotline hàm writeToFile cùng truyền vào kia nhỏ trỏ tệp tin, câu hỏi ghi file đã khiến cho internal tệp tin position indicator trỏ đến địa chỉ cuối cùng trong file. Sau khi quay trở lại hàm main, bọn họ liên tiếp gọi hàm readFromFile với một nhỏ trỏ tệp tin. Như vậy, lúc họ hiểu tệp tin thì họ lại bước đầu đọc trên vị trí dứt file.

Để khắc phục điều này, họ buộc phải đóng con trỏ file lại cùng msinh sống chế tạo ra một links mới bởi hàm fopen cùng với mode dùng làm đọc file. Tuy nhiên, có tác dụng điều đó thì code cách xử trí của họ vẫn dài ra hơn nữa. Thư viện cstdio đang hỗ trợ mang lại bọn họ hàm fseek nhằm đổi khác địa chỉ trỏ đến vào tệp tin của internal file position indicator.

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

f là nhỏ trỏ trỏ mang đến đối tượng FILE vẫn mlàm việc.

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

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

*

Bởi vậy, sau thời điểm Điện thoại tư vấn hàm writeToFile chấm dứt, bọn họ cần dịch rời internal tệp tin position indicator về đầu tệp tin bằng phương pháp nlỗi sau:

writeToFile(file);fseek(file, 0, SEEK_SET);readFromFile(file);Sau kia chạy công tác thì thấy tài liệu in ra màn hình hiển thị đúng như các gì chúng ta đã ghi vào file.

Determine form size of nội dung of file

Thông thường chúng ta bắt buộc gọi toàn cục nội dung của file vào một vùng nhớ bên trên Heap, họ đã cần phải biết trước size văn bản tất cả vào file để cấp phát đủ vùng nhớ trước lúc gọi tệp tin. Thư viện cstdio chỉ cung cấp cho chúng ta hàm ftell:

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

do vậy, các bạn có thể gọi form size của ngôn từ trong file bằng phương pháp dịch internal file position indicator về vị trí cuối cùng vào tệp tin rồi Gọi hàm ftell:

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

size_t fwrite(const void *ptr, size_t kích thước, size_t count, FILE *f);Hàm fwrite dùng làm ghi hàng bit vào vùng lưu giữ được quản lý vì bé trỏ ptr vào file đang được trỏ vày f, form size là số bytes đã copy từ bỏ vùng lưu giữ của ptr cùng count là số lần ghi vùng ghi nhớ kia xuống file.

Hàm fwrite ko quyên tâm vùng nhớ của chúng ta tất cả format gì, nó quan tâm size vùng lưu giữ phải gọi cùng cđọng vậy copy toàn bộ các bits với tệp tin, những lần sẽ copy 1 bloông xã of bit.

size_t fread(void *ptr, size_t form size, size_t count, FILE *f);Hàm fread đang copy count lần blochồng of bits bao gồm form size là size, gửi vào vùng ghi nhớ được trỏ mang lại vì ptr, tự file đang rất được cai quản vày f.

Sau Lúc Call hàm fread, internal file position indicator đang di chuyển cho tới (form size * count) bytes từ bỏ vị trí ban đầu hiểu 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(tệp tin, 0, SEEK_SET);readFromFile(file);fclose(file);return 0;Chạy lịch trình trên đã cho ra công dụng là rất nhiều kí từ rác rưởi.

Như chúng ta thấy, hàm fread hiểu đúng 255 bytes trong file để đưa vào vùng ghi nhớ của ptr bắt buộc các quý hiếm vượt mở ra. Trong trường hợp này, dùng hàm fread cùng fwrite ko tương xứng. Hàm fread với fwrite thường xuyên được dùng để làm hiểu cùng ghi tài liệu phong cách struct vào file.

Write and read structs

Mình vẫn giữ nguyên cấu tạo cmùi hương trinh nhỏng bên trên và chỉ chuyển đổi code vào hàm writeToFile cùng readFromFile.

Trước hết, bản thân chế tạo một struct đơn giản nlỗi sau:

struct Employee__int32 ID;char name<50>;;Kích thước của struct này là 56 bytes (chưa hẳn là 54 bytes vị phương pháp tổ chức triển khai tài liệu trong struct còn liên quan cho định nghĩa struct alignment). bởi vậy là từng unit gồm hình dáng Employee được tạo nên đầy đủ chiếm một vùng lưu giữ có form size 56 bytes.

Các các bạn test tưởng tượng giả dụ bọn họ thực hiện các hàm ghi file nhỏng fputs, fprintf... thì size thương hiệu của mọi cá nhân đã khác nhau dẫn mang lại bọn họ không tồn tại một format phổ biến nhằm dễ thống trị nhiều Employee trong file. Việc đặt chúng nó vào trong một struct giúp chúng ta gọi và ghi file tiện lợi rộng các.

Dưới đấy là một quãng công tác mẫu mã cho việc cách 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 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 các bạn chạy thử đoạn chương trình trên để xem hiệu quả.

Bây giờ đồng hồ họ cùng mngơi nghỉ tệp tin my_document.txt trong tlỗi mục Desktop giúp xem test nội dung vào file như vậy nào: