đọc file trong c++

Chào chúng ta đang theo dõi và quan sát khóa học lập trình sẵn trực con đường ngữ điệu C++.

You watching: đọc file trong c++

Trong bài học kinh nghiệm này, bọn họ đã cùng tò mò về những định nghĩa về File cùng phương pháp để thao tác làm việc cùng với File vào ngữ điệu thiết kế C/C++.

File

Nếu máy vi tính của các bạn gồm ổ cứng, hoặc các bạn gồm USB hoặc bất kỳ vật dụng lưu trữ như thế nào thì chắc hẳn rằng chúng ta đã từng thao tác cùng với File. Khi chúng ta nghịch một game offline, biết tin nhân thiết bị, điểm số, ... sẽ được lưu trữ vào File để lúc chương trình game bị tắt đi thì chúng ta không hẳn đùa lại từ trên đầu. Lúc chúng ta cài đặt thông số kỹ thuật cho 1 phần mượt với tắt đi, thông số kỹ thuật đó được lưu giữ vào File để lần thao tác làm việc tiếp theo sau đang áp dụng. Hay khi chúng ta biên dịch một chương trình 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 file *.hillarypac.org để chất vấn lỗi với dịch bọn chúng sang tệp tin *.obj. ngay khi hệ quản lý Windows nhưng mà các bạn đang áp dụng cũng là tập đúng theo của đa số file được tàng trữ bên phía trong phân vùng ổ đĩa dùng cho Hệ quản lý và điều hành...

Đó là 1 trong những vài ba ví dụ cho biết sự tồn tại của File vào máy tính. Vậy thì họ vẫn làm việc cùng với gần như File đó như vậy nào?

Làm Việc cùng với File bọn họ chỉ gồm các làm việc cơ phiên bản như: sản xuất tệp tin mới, đọc dữ liệu trong tệp tin, ghi tài liệu vào tệp tin, xóa tệp tin... Và họ có tác dụng điều đó từng ngày, lúc họ chơi trò chơi, khi chứng kiến tận mắt phyên trên máy vi tính, ... và trong cả khi bọn họ thiết kế, mã mối cung cấp của chúng ta được lưu lại xuống File mã nguồn Khi dấ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 máy tính là một trong những tài nguyên dùng để làm tàng trữ ban bố lâu dài, thực hiện cho những công tác máy vi tính.

Cũng giống hệt như bài toán tàng trữ dữ liệu trong thời điểm tạm thời bên trên RAM, tệp tin cũng lưu trữ dữ liệu bên dưới dạng nhị phân (0 hoặc 1), tuy nhiên tùy thuộc theo định hình của file và biện pháp biến hóa của từng phần mềm hiểu file mà chúng ta bao gồm hình dáng lên tiếng khác nhau. lấy một ví dụ file .png thì được gửi về hình dáng ảnh, ứng dụng Microsoft Word chuyển hàng bit nhị phân về dạng text...

Trong ngữ điệu lập trình C/C++: File là đẳng cấp đối tượng người tiêu dùng, nó xác minh một stream cùng cất các thông báo cần thiết để tinh chỉnh, bao gồm một con trỏ trỏ mang đến buffer của nó, những chỉ mục cùng tinh thần của chính nó.

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

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

Làm bài toán với FILE type vào C/C++

Trong bài học kinh nghiệm này, bản thân sẽ lí giải các bạn thực hiện những làm việc nlỗi mnghỉ ngơi file, đọc với ghi tài liệu vào tệp tin... Chúng ta yêu cầu thao tác làm việc bên trên một tệp tin rõ ràng làm sao đó buộc phải mình sẽ tạo một tệp tin với thương hiệu file là my_document.txt trong thỏng mục Desktop tất cả đường dẫn trên sản phẩm công nghệ bản thân là: C:/Users/ADMIN/Desktop/my_document.txt

Để thao tác làm việc với file, bọn họ cần phải biết địa điểm của file (thông qua mặt đường dẫn) nhằm nhỏ trỏ kiểu FILE rất có thể tạo được luồng dữ liệu giữa người tiêu dùng và tệp tin trên sản phẩm 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 file, các bạn có thể thực hiện hàm fopen được có mang trong tlỗi viện cstdio:

FILE* fopen(const char *file, const char *mode);Hàm fopen được cho phép tạo ra một kết nối mang đến tệp tin với đường truyền được lưu trữ vày tmê say số trước tiên. Nếu tệp tin ko sống thọ, tệp tin bắt đầu sẽ tiến hành tạo thành với thương hiệu tệp tin như trong đường dẫn. Tđê mê số sản phẩm hai xác định kiểu truy cập vào tệp tin. Bảng dưới đây liệt kê các mode dùng để làm mtại một tệp tin vào C:


*

Nếu mngơi nghỉ file thành công xuất sắc, một liên can của một đối tượng người tiêu dùng mẫu mã FILE sẽ tiến hành trả về. Nếu mlàm việc tệp tin thất 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 open this file" << std::endl;elsestd::cout << "File is opened" << std::endl;Trong đoạn công tác trên, bản thân msinh sống file đã sản xuất sẵn trong tlỗi mục Desktop với mode "r" (chỉ dùng làm hiểu dữ liệu).

Các bạn cần để ý rằng tệp tin vào máy tính xách tay mãi mãi ở hai dạng: file văn uống bạn dạng với file bị mã hóa.

File vnạp năng lượng phiên bản là những file mà những bạn có thể hiểu được Lúc mở bởi các trình soạn thảo vnạp năng lượng bản, thường thì những file này được format Unicode (hoặc đa số định dạng dùng cho văn uống bạn dạng khác).

File bị mã hóa (hay Hotline là tệp tin nhị phân) không thể gọi được lúc mnghỉ ngơi tệp tin bằng những trình biên soạn thảo vnạp năng lượng bạn dạng. Sử dụng File bị mã hóa góp bọn họ bảo mật thông tin dữ liệu xuất sắc hơn File văn bạn dạng.

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

Cthua file

Sau Khi làm việc cùng với file chấm dứt, các bạn phải đóng file lại nhằm tách rất nhiều lỗi tạo ra quanh đó ý mong muốn. Để đóng file, bọn 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ữ tương tác của đối tượng người tiêu dùng FILE vẫn msống. Nếu đóng tệp tin thành công xuất sắc thì trả về quý giá 0, ngược 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 fcthua thảm đang giải pchờ tất cả tài liệu không được cách xử trí bên trên file nếu như chúng vẫn tồn tại giữ vào buffer, đóng file lại, cùng giải pđợi tất cả khu vực ghi nhớ mà đối tượng FILE sử dụng.

Write data to file

Các chúng ta đang tiến hành được thao tác làm việc msinh sống với đóng góp file, tuy nhiên từ bây giờ, tệp tin mới tạo ra vẫn chưa có tài liệu nên bản thân vẫn thực hiện thao tác làm việc ghi dữ liệu vào file trước. Để msinh hoạt tệp tin mang lại cơ chế ghi tệp tin, chúng ta bao gồm những mode "w", "r+", "w+", "a", "a+". Mình chỉ ước ao ghi dữ liệu bắt buộc bản thân vẫn chọn mode "w".

Nhưng đầu tiên, họ cần tách thao tác ghi tệp tin ra một hàm riêng rẽ bao gồm dạng:

void writeToFile(FILE *file);Hàm này sẽ tiến hành Hotline sau thời điểm msinh sống tệp tin cùng trước lúc đóng 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ồ, họ chỉ quan tâm mang đến văn bản bên trong hàm writeToFile.

Để ghi dữ liệu vào file, chúng ta có những hàm đã được khái niệm sẵn trong tlỗi viện cstdio như sau:

fputc:

int fputc(int c, FILE *f);Hàm fputc đã ghi cam kết từ bỏ tất cả mã ASCII là c vào tệp tin được trỏ mang lại vì con trỏ f. Giá trị trả về là EOF ví như ghi tài liệu không thắng cuộc, trả về mã ASCII của kí trường đoản cú được ghi vào giả dụ triển khai 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 ngừng, các bạn msinh hoạt tệp tin 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í tự "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ỏ mang đến vị con trỏ f cho đến khi gặp mặt kí từ "".

Ví dụ:

void writeToFile(FILE *file)int c = fputs("hello", file);Sau khi chạy chương trình, chúng ta mnghỉ ngơi tệp tin my_document.txt làm việc thư mục Desktop vẫn thấy kí từ "A" thời điểm nãy không thể nữa, cầm cố vào chính là chuỗi kí trường đoản cú "hello".

See more: Cách Gỡ Bỏ Itunes Tren May Tinh, Xóa Bài Hát Và Các Mục Khác Trong Itunes Trên Pc

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 những ví dụ vào phần này, mình đang Call hàm này sau khoản thời gian vẫn Đ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);Hiện nay, tệp tin của họ được mở nhằm vừa gọi và ghi file, cần bản thân sẽ sử dụng 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 trong tlỗi viện cstdio cung ứng họ đọc tài liệu văn uống bản trường đoản cú file.

fgetc:

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

Reposition stream position indicator

Ghép các ví dụ nghỉ ngơi bên trên lại, họ gồm một công tác đơn giản dễ dàng minh họa mang lại việc ghi tệp tin và đọc từng chiếc tài liệu (line by line) đã đượ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, công dụng cho ra màn hình không giống như mong ước.

Ngulặng nhân là lúc họ Gọi hàm writeToFile với truyền vào đó con trỏ tệp tin, bài toán ghi tệp tin sẽ khiến internal file position indicator trỏ mang đến địa điểm sau cuối vào tệp tin. Sau lúc quay trở về hàm main, chúng ta liên tiếp điện thoại tư vấn hàm readFromFile với một con trỏ file. bởi thế, thời gian chúng ta phát âm tệp tin thì bọn họ lại bước đầu gọi trên địa chỉ hoàn thành file.

Để hạn chế điều này, bọn họ buộc phải đóng nhỏ trỏ tệp tin lại cùng mlàm việc sinh sản một link new bằng hàm fopen với mode dùng để làm gọi file. Tuy nhiên, làm điều này thì code cách xử trí của bọn họ đang dài thêm hơn. Thỏng viện cstdio sẽ cung cấp cho bọn họ hàm fseek nhằm biến hóa vị trí trỏ đến trong file của internal file position indicator.

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

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

offmix là số bytes được thêm vào đó tính tự địa chỉ 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 chấm dứt, bọn họ buộc phải di chuyển internal file position indicator về đầu file bằng cách nhỏng sau:

writeToFile(file);fseek(file, 0, SEEK_SET);readFromFile(file);Sau đó chạy công tác thì thấy tài liệu in ra screen đúng như các gì chúng ta đang ghi vào tệp tin.

Determine size of content of file

Thông thường họ nên gọi cục bộ nội dung của tệp tin vào trong 1 vùng ghi nhớ bên trên Heap, bọn họ sẽ cần phải biết trước size ngôn từ có vào tệp tin để cấp phép đầy đủ vùng ghi nhớ trước lúc đọc tệp tin. Thỏng viện cstdio chỉ cung ứng mang đến bọn họ hàm ftell:

long int ftell(FILE *f);Hàm này đang trả về địa chỉ của file indicator sẽ trỏ mang lại trong file (số bytes của câu chữ file mà indicator đã để ý qua).

Bởi vậy, những bạn cũng có thể phát âm kích thước của văn bản 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 điện thoại tư vấn 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 đây là 2 hàm dùng để đọc với ghi dữ liệu chỉ dùng mang lại 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 vào vùng nhớ được quản lý bởi con trỏ ptr vào tệp tin đang được trỏ do f, kích cỡ là số bytes đang copy từ vùng nhớ của ptr và count là chu kỳ ghi vùng lưu giữ đó xuống file.

Hàm fwrite không quyên tâm vùng lưu giữ của các bạn bao gồm format gì, nó quan tâm form size vùng nhớ cần gọi với cứ cụ copy toàn bộ những bits cùng file, mỗi lần đã copy 1 blochồng of bit.

size_t fread(void *ptr, size_t form size, size_t count, FILE *f);Hàm fread sẽ copy count lần block of bits tất cả form size là form size, chuyển vào vùng ghi nhớ được trỏ đến do ptr, trường đoản cú tệp tin đang được quản lý vì chưng f.

Sau Lúc hotline hàm fread, internal file position indicator đang dịch chuyển cho tới (kích thước * count) bytes từ bỏ địa chỉ ban đầu gọi 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 bên trên tạo ra hiệu quả là tương đối nhiều kí trường đoản cú rác rưởi.

Nlỗi chúng ta thấy, hàm fread đọc đúng 255 bytes trong file để đưa vào vùng ghi nhớ của ptr phải các quý hiếm vượt lộ diện. Trong ngôi trường hợp này, dùng hàm fread và fwrite ko phù hợp. Hàm fread cùng fwrite hay được dùng để làm phát âm với ghi tài liệu phong cách struct vào file.

Write và read structs

Mình vẫn giữ nguyên kết cấu cmùi hương trinc như trên còn chỉ chuyển đổi code trong hàm writeToFile cùng readFromFile.

Trước hết, bản thân sinh sản 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 (chưa hẳn là 54 bytes vì phương pháp tổ chức tài liệu trong struct còn tương quan mang đến quan niệm struct alignment). do vậy là từng unit tất cả dạng hình Employee được tạo nên đông đảo chỉ chiếm một vùng nhớ tất cả kích cỡ 56 bytes.

Các các bạn test tưởng tượng nếu như chúng ta thực hiện các hàm ghi tệp tin nlỗi fputs, fprintf... thì kích cỡ tên của mỗi cá nhân đã khác biệt dẫn mang lại chúng ta không có một định hình thông thường nhằm dễ quản lý nhiều Employee vào file. Việc đặt nó vào trong một struct giúp bọn họ hiểu cùng ghi tệp tin thuận tiện rộng những.

See more: Cách Lấy Link Bài Đăng Trên Facebook, Cách Lấy Link Video, Ảnh, Bài Viết Facebook

Dưới đó là một đoạn lịch trình mẫu cho Việc xử lý tệp tin nhằm thống trị 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;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;Các chúng ta chạy thử đoạn chương trình bên trên để thấy hiệu quả.

Bây giờ chúng ta thuộc mnghỉ ngơi file my_document.txt vào thư mục Desktop giúp xem thử nội dung trong tệp tin như vậy nào: