Đọc file trong c++

Chào chúng ta sẽ theo dõi và quan sát khóa huấn luyện và đào tạo thiết kế trực con đường ngôn ngữ C++.

Bạn đang xem: Đọc file trong c++

Trong bài học kinh nghiệm này, chúng ta đã thuộc tìm hiểu về các có mang về File và phương pháp để thao tác làm việc cùng với File trong ngôn ngữ lập trình C/C++.

File

Nếu máy vi tính của các bạn có ổ cứng, hoặc chúng ta gồm USB hoặc bất kỳ đồ vật lưu trữ làm sao thì chắc chắn là các bạn đã từng thao tác làm việc cùng với File. lúc các bạn nghịch một game offline, biết tin nhân thiết bị, điểm số, ... sẽ được lưu trữ trong File để khi lịch trình game bị tắt đi thì các bạn chưa phải đùa lại từ đầu. Khi chúng ta thiết đặt thông số kỹ thuật cho một trong những phần mượt với tắt đi, thông số kỹ thuật này được giữ vào File nhằm lần làm việc tiếp theo vẫn áp dụng. Hay Khi các bạn biên dịch một công tác C++ trên Visual Studio năm ngoái, C++ Compiler của Visual studio đang gọi mã mối cung cấp chúng ta sẽ viết trong các tệp tin *.ehefs.org để kiểm tra lỗi cùng dịch chúng quý phái file *.obj. Ngay cả hệ điều hành quản lý Windows nhưng mà các bạn đã thực hiện cũng là tập vừa lòng của không ít file được tàng trữ phía bên trong phân vùng ổ đĩa dùng mang đến Hệ quản lý điều hành...

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

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

Theo khái niệm bên trên Wikipedia về computer file: Một tệp tin trên laptop là 1 tài nguim dùng làm tàng trữ biết tin dài lâu, thực hiện cho các công tác máy tính xách tay.

Cũng y hệt như vấn đề lưu trữ dữ liệu tạm thời trên RAM, tệp tin cũng tàng trữ tài liệu dưới dạng nhị phân (0 hoặc 1), tuy vậy tùy theo định dạng của tệp tin với phương pháp chuyển đổi của từng phần mềm gọi file cơ mà bọn họ bao gồm phong cách thông báo khác biệt. Ví dụ tệp tin .png thì được gửi về mẫu mã ảnh, ứng dụng Microsoft Word chuyển dãy bit nhị phân về dạng text...

Trong ngôn từ xây dựng C/C++: File là hình dáng đối tượng người dùng, nó xác minh một stream cùng chứa các lên tiếng quan trọng nhằm điều khiển và tinh chỉnh, gồm một bé trỏ trỏ mang lại buffer của chính nó, những chỉ mục và tâm lý của chính nó.

Các bạn cũng có thể hiểu File (vào ngữ điệu thiết kế C/C++) là 1 trong những mẫu mã đối tượng người sử dụng nhưng mà trải qua nó chúng ta cũng có thể làm việc cùng với tài liệu được tàng trữ bên phía trong File (chđọng chưa phải là một trong File trên trang bị tính).

Để các bạn không xẩy ra lầm lẫn, bản thân đã nói tới loại dữ liệu FILE được định nghĩa trong thư viện cstdio (tốt stdio.h) mà rất có thể chúng ta đã từng học tập trong ngữ điệu C. Chúng ta đã học tập giải pháp áp dụng những Stream nhằm thao tác với tệp tin núm bởi vì thực hiện vẻ bên ngoài dữ liệu FILE trong số bài học kinh nghiệm sau, dẫu vậy mình nghĩ vẻ bên ngoài tài liệu FILE vào thư viện cstdio cũng có phần đông ưu thế riêng biệt của chính nó yêu cầu mình không làm lơ bài học này.

Làm Việc với FILE type vào C/C++

Trong bài học này, mình vẫn gợi ý chúng ta tiến hành những thao tác nlỗi mnghỉ ngơi file, hiểu cùng ghi dữ liệu trong file... Chúng ta cần thao tác làm việc bên trên một file cụ thể như thế nào đó buộc phải mình sẽ khởi tạo một tệp tin cùng với thương hiệu file là my_document.txt vào thư mục Desktop bao gồm băng thông bên trên thiết bị mình là: C:/Users/ADMIN/Desktop/my_document.txt

Để thao tác làm việc cùng với tệp tin, chúng ta cần biết địa điểm của file (thông qua con đường dẫn) để nhỏ trỏ loại FILE có thể tạo được luồng dữ liệu giữa người tiêu dùng và tệp tin trên thứ lưu trữ.

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

FILE* fopen(const char *tệp tin, const char *mode);Hàm fopen có thể chấp nhận được tạo nên một kết nối đến file với băng thông được tàng trữ do tmê say số đầu tiên. Nếu tệp tin không mãi sau, file bắt đầu sẽ tiến hành tạo ra cùng với tên tệp tin như vào đường dẫn. Ttê mê số trang bị nhì khẳng định kiểu dáng truy cập vào file. Bảng tiếp sau đây liệt kê các mode dùng làm mtại 1 file trong C:


*

Nếu msinh sống file thành công xuất sắc, một liên quan của một đối tượng người dùng thứ hạng FILE sẽ tiến hành trả về. Nếu mnghỉ ngơi file không thắng 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 lịch trình trên, bản thân mở tệp tin đã sinh sản sẵn trong tlỗi mục Desktop với mode "r" (chỉ dùng làm gọi dữ liệu).

Các bạn cần chú ý rằng file trong laptop mãi sau ở 2 dạng: file văn uống phiên bản và tệp tin bị mã hóa.

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

File bị mã hóa (hay hotline là file nhị phân) cần thiết gọi được lúc mlàm việc tệp tin bằng những trình soạn thảo văn uống phiên bản. Sử dụng File bị mã hóa góp họ bảo mật dữ liệu xuất sắc rộng File văn bạn dạng.

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

Cthua file

Sau khi thao tác cùng với tệp tin xong, chúng ta đề xuất đóng góp file lại nhằm tách rất nhiều lỗi tạo ra kế bên ý mong. Để đóng góp tệp tin, chúng ta áp dụng hàm fclose:

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

Write data khổng lồ file

Các các bạn đang thực hiện được thao tác mở với đóng góp tệp tin, nhưng bây giờ, tệp tin mới tạo ra vẫn chưa tồn tại dữ liệu đề nghị mình vẫn triển khai thao tác ghi tài liệu vào tệp tin trước. Để mở file đến chế độ ghi tệp tin, họ bao gồm các mode "w", "r+", "w+", "a", "a+". Mình chỉ mong mỏi ghi tài liệu bắt buộc bản thân đã lựa chọn mode "w".

Nhưng đầu tiên, chúng ta buộc phải tách bóc thao tác làm việc ghi tệp tin ra một hàm riêng rẽ có dạng:

void writeToFile(FILE *file);Hàm này sẽ tiến hành call sau khoản thời gian mnghỉ ngơi file cùng trước khi đóng file.

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ồ, bọn họ chỉ quyên tâm cho câu chữ bên trong hàm writeToFile.

Để ghi dữ liệu vào file, chúng ta gồm các hàm đã làm được có mang sẵn trong thỏng viện cstdio nhỏng sau:

fputc:

int fputc(int c, FILE *f);Hàm fputc vẫn ghi ký kết từ có mã ASCII là c vào tệp tin được trỏ mang lại vày nhỏ trỏ f. Giá trị trả về là EOF ví như ghi dữ liệu thất bại, trả về mã ASCII của kí tự được ghi vào nếu như 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 lúc chạy chương trình hoàn thành, các bạn msống file my_document.txt trên Desktop lên đã thấy kí trường đoản cú "A" đã có được ghi vào, mặt khác 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 vì con trỏ f cho tới Khi gặp mặt kí từ bỏ "".

Ví dụ:

void writeToFile(FILE *file)int c = fputs("hello", file);Sau lúc chạy công tác, các bạn mlàm việc tệp tin my_document.txt sinh hoạt thỏng mục Desktop vẫn thấy kí tự "A" thời gian nãy không còn nữa, cố kỉnh vào sẽ là chuỗi kí trường đoản cú "hello".

Read data from file

Thứ nhất bản thân sẽ khởi tạo một hàm không giống có tên là readFromFile nlỗi sau:

void readFromFile(FILE *file)//read dataĐể có tác dụng các ví dụ vào phần này, mình vẫn điện thoại tư vấn hàm này sau khi đang Hotline 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);Hiện nay, tệp tin của chúng ta được mngơi nghỉ nhằm vừa đọc và ghi file, đề nghị mình sẽ thực hiện mode "w+" (hoặc "r+").

Và dưới đấy là một số trong những hàm được khái niệm sẵn vào thư viện cstdio hỗ trợ chúng ta đọc tài liệu văn uống bản từ bỏ 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 đang gửi mang lại kí trường đoản cú tiếp sau. Giá trị trả về là mã ASCII của kí tự vẫn 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ừ bỏ file ra (n - 1) kí từ bỏ, vấn đề đọc tài liệu sẽ bị giới hạn giả dụ đọc được kí tự new line " " hoặc EOF. Chuỗi kí từ bỏ đọc được sẽ lưu lại vào vùng lưu giữ được làm chủ vày con trỏ buf, ví như hiểu tài liệu thành công thì trả về ảnh hưởng 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 đọc file được lưu giữ vào mảng kí từ bỏ str.

Reposition stream position indicator

Ghnghiền các ví dụ ngơi nghỉ trên lại, bọn họ gồm một chương trình đơn giản minch họa cho câu hỏi ghi file với phát âm từng chiếc dữ liệu (line by line) đã làm được ghi vào file 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;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);return 0;Tuy nhiên, tác dụng đã tạo ra màn hình không phải như mong ước.

Nguim nhân là lúc chúng ta hotline hàm writeToFile cùng truyền vào đó bé trỏ tệp tin, vấn đề ghi tệp tin đã khiến internal file position indicator trỏ mang lại địa điểm sau cùng trong tệp tin. Sau khi quay lại hàm main, bọn họ tiếp tục Call hàm readFromFile với 1 bé trỏ tệp tin. do vậy, lúc chúng ta đọc file thì họ lại ban đầu hiểu tại địa điểm hoàn thành tệp tin.

Để khắc chế vấn đề đó, bọn họ đề nghị đóng góp nhỏ trỏ file lại cùng msống tạo ra một links new bằng hàm fopen với mode dùng để làm hiểu file. Tuy nhiên, có tác dụng như vậy thì code xử trí của bọn họ sẽ dài thêm hơn. Tlỗi viện cstdio đang hỗ trợ cho chúng ta 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 offmix, int origin);Trong đó:

f là bé trỏ trỏ mang đến đối tượng người tiêu dùng FILE vẫn msinh sống.

offphối là số bytes được thêm vào đó tính tự địa chỉ origin.

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

*

do vậy, sau thời điểm điện thoại tư vấn hàm writeToFile hoàn thành, họ đề xuất di chuyển internal file position indicator về đầu file bằng phương pháp như sau:

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

Determine kích thước of nội dung of file

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

long int ftell(FILE *f);Hàm này sẽ trả về địa điểm của file indicator vẫn trỏ mang đến trong tệp tin (số bytes của ngôn từ tệp tin cơ mà indicator sẽ cẩn thận qua).

Bởi vậy, những chúng ta 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 vào tệp tin rồi Gọi hàm ftell:

__int64 size_of_file(FILE *file)fseek(file, 0, SEEK_END);__int64 kích thước = ftell(file);fseek(file, 0, SEEK_SET);return size;Binary I/O functionsDưới đó là 2 hàm dùng làm phát âm và ghi dữ 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 dãy bit trong vùng lưu giữ được cai quản vì chưng bé trỏ ptr vào tệp tin đang được trỏ vì chưng f, kích cỡ là số bytes đang copy từ bỏ vùng ghi nhớ của ptr và count là chu kỳ ghi vùng nhớ kia xuống tệp tin.

Hàm fwrite ko quyên tâm vùng lưu giữ của chúng ta tất cả format gì, nó quan tâm form size vùng lưu giữ đề xuất phát âm và cđọng nắm copy tất cả những bits với file, những lần đã 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 bao gồm kích cỡ là kích thước, đưa vào vùng lưu giữ được trỏ đến vì chưng ptr, từ bỏ tệp tin đang rất được thống trị do f.

Sau Lúc Hotline hàm fread, internal tệp tin position indicator vẫn dịch chuyển tới (form size * count) bytes từ bỏ vị trí bắt đầu đọc tệp tin.

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à tương đối nhiều kí trường đoản cú rác rến.

Nlỗi các bạn thấy, hàm fread đọc đúng 255 bytes trong tệp tin để đưa vào vùng lưu giữ của ptr buộc phải những giá trị quá xuất hiện. Trong ngôi trường hòa hợp này, sử dụng hàm fread cùng fwrite ko tương xứng. Hàm fread cùng fwrite thường được dùng để gọi cùng ghi dữ liệu hình trạng struct vào tệp tin.

Write & read structs

Mình vẫn giữ nguyên cấu trúc cmùi hương trinch như trên và chỉ còn biến hóa code trong hàm writeToFile với readFromFile.

Trước không còn, bản thân 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 phải là 54 bytes bởi vì cách tổ chức dữ liệu vào struct còn liên quan cho tư tưởng struct alignment). do đó là mỗi unit bao gồm mẫu mã Employee được tạo thành đầy đủ chỉ chiếm một vùng nhớ có kích thước 56 bytes.

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

Xem thêm: Sự Thật Đằng Sau Câu Nói: “ Trời Đã Sinh Du Sao Còn Sinh Lượng

Dưới đấy là một quãng chương trình mẫu mang lại 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 Dinc 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;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;Các bạn chạy thử đoạn lịch trình bên trên giúp xem tác dụng.

Bây giờ đồng hồ chúng ta cùng mngơi nghỉ file my_document.txt vào thỏng mục Desktop giúp thấy test nội dung vào file như thế nào:

table('setting')->where("{$db->web}")->select('code_footer'); if($oh->code_footer){ # nếu có code header tùy chỉnh $code_footer = htmlspecialchars_decode($oh->code_footer); $code_footer = str_replace('[home_link]', $home, $code_footer); $code_footer = str_replace('[home_name]', $h, $code_footer); $code_footer = str_replace('[link]', $link, $code_footer); $code_footer = str_replace('[title]', $head->tit, $code_footer); $code_footer = str_replace('[des]', $head->des, $code_footer); $code_footer = str_replace('[key]', $head->key, $code_footer); $code_footer = str_replace('[image]', $head->img, $code_footer); $code_footer = str_replace('[link]', $link, $code_footer); $code_footer = str_replace('[date_Y]', date('Y'), $code_footer); echo $code_footer; } ?>