Cách đọc file trong c++

  -  

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

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

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

Đó là 1 trong những vài ví dụ cho biết thêm sự lâu dài của File vào máy tính xách tay. 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 làm việc cơ phiên bản như: tạo file mới, phát âm dữ liệu vào file, ghi tài liệu vào file, xóa tệp tin... Và họ làm điều đó mỗi ngày, Lúc họ chơi trò giải trí, lúc xem phim bên trên máy tính, ... và ngay cả lúc bọn họ thiết kế, mã mối cung cấp của bọn họ được lưu lại xuống File mã nguồn lúc dìm tổng hợp phím Ctrl + S.

Theo định nghĩa bên trên Wikipedia về computer file: Một tệp tin bên trên máy tính xách tay là 1 trong những tài ngulặng dùng làm tàng trữ biết tin dài lâu, sử dụng cho những lịch trình máy tính.

Cũng y 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, tệp tin cũng lưu trữ dữ liệu dưới dạng nhị phân (0 hoặc 1), tuy vậy tùy vào format của tệp tin và biện pháp biến đổi của từng ứng dụng gọi file nhưng mà họ gồm có hình dáng ban bố không giống nhau. lấy ví dụ như file .png thì được đưa về ngoại hình hình ảnh, phần mềm Microsoft Word đưa dãy bit nhị phân về dạng text...

Trong ngôn ngữ lập trình C/C++: File là giao diện đối tượng người sử dụng, nó xác minh một stream và chứa những đọc tin quan trọng nhằm tinh chỉnh và điều khiển, gồm 1 bé trỏ trỏ cho buffer của chính nó, các chỉ mục cùng trạng thái của 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à 1 trong thứ hạng đối tượng người dùng mà thông qua nó bạn cũng có thể thao tác với dữ liệu được lưu trữ phía bên trong File (chứ chưa phải là một trong File bên trên thứ tính).

Để chúng ta không bị lầm lẫn, mình vẫn nói đến giao diện dữ liệu FILE được tư tưởng vào thỏng viện cstdio (tốt stdio.h) nhưng rất có thể chúng ta đã có lần học tập vào ngữ điệu C. Chúng ta đã học tập cách sử dụng các Stream nhằm làm việc cùng với file chũm vì chưng sử dụng đẳng cấp tài liệu FILE trong những bài học sau, mà lại mình suy nghĩ kiểu dáng dữ liệu FILE trong tlỗi viện cstdio cũng có phần nhiều ưu thế riêng biệt của chính nó yêu cầu bản thân không bỏ qua bài học này.

Làm việc 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 các bạn triển khai các thao tác nhỏng mnghỉ ngơi tệp tin, phát âm với ghi tài liệu trong file... Chúng ta cần làm việc bên trên một file rõ ràng làm sao kia đề nghị mình sẽ tạo nên một tệp tin với thương hiệu file là my_document.txt vào tlỗi mục Desktop tất cả băng thông trên trang bị bản thân là: C:/Users/ADMIN/Desktop/my_document.txt

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

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

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


*

Nếu msinh hoạt tệp tin thành công, một can dự của một đối tượng loại FILE sẽ tiến hành trả về. Nếu mở tệp tin 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 trên, bản thân msinh sống tệp tin vẫn sản xuất sẵn trong thỏng mục Desktop với mode "r" (chỉ dùng để làm gọi dữ liệu).

Các bạn phải xem xét rằng file vào máy vi tính mãi mãi ở cả 2 dạng: tệp tin vnạp năng lượng bạn dạng cùng tệp tin bị mã hóa.

File văn uống bạn dạng là đa số file cơ mà những chúng ta có thể phát âm được Lúc mnghỉ ngơi bởi các trình biên soạn thảo văn uống phiên bản, thường thì phần nhiều file này được format Unicode (hoặc hầu như định dạng sử dụng mang lại văn uống bản khác).

File bị mã hóa (thường xuyên gọi là file nhị phân) quan yếu phát âm được khi mngơi nghỉ file bởi những trình soạn thảo vnạp năng lượng phiên bản. Sử dụng File bị mã hóa giúp chúng ta bảo mật tài liệu giỏi rộng File vnạp năng lượng phiên bản.

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

Cthất bại file

Sau khi thao tác làm việc cùng với tệp tin ngừng, chúng ta đề nghị đóng góp tệp tin lại nhằm tránh phần nhiều lỗi phát sinh quanh đó ý ước ao. Để đóng góp file, họ áp dụng hàm fclose:

int fclose(FILE *file);Trong đó, file là nhỏ trỏ được dùng để tàng trữ shop của đối tượng FILE vẫn mở. Nếu đóng góp tệp tin thành công 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;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 kém sẽ giải phóng tất cả dữ liệu không được cách xử lý trên tệp tin giả dụ chúng vẫn tồn tại lưu lại vào buffer, đóng tệp tin lại, và giải phóng toàn vùng ghi nhớ nhưng đối tượng người dùng FILE áp dụng.

Write data to lớn file

Các các bạn đang triển khai được thao tác làm việc mnghỉ ngơi cùng đóng tệp tin, tuy vậy từ bây giờ, tệp tin mới tạo ra vẫn chưa có dữ liệu đề nghị bản thân sẽ triển khai làm việc ghi dữ liệu vào file trước. Để mngơi nghỉ tệp tin cho cơ chế ghi file, bọn họ gồm các mode "w", "r+", "w+", "a", "a+". Mình chỉ mong ghi dữ liệu phải bản thân đã lựa chọn mode "w".

Nhưng trước tiên, họ bắt buộc tách bóc 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ẽ được gọi sau thời điểm mnghỉ ngơi file với trước lúc đó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 tiếng, họ chỉ quan tâm cho câu chữ bên phía trong hàm writeToFile.

Để ghi tài liệu vào tệp tin, chúng ta có các hàm đã có được tư tưởng sẵn trong thư viện cstdio nlỗi sau:

fputc:

int fputc(int c, FILE *f);Hàm fputc đã ghi ký kết tự tất cả mã ASCII là c vào tệp tin được trỏ cho bởi vì 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ư thực hiện thành công.

Ví dụ:

void writeToFile(FILE *file)int c = fputc("A", file);std::cout << c << std::endl;Sau khi chạy công tác xong, chúng ta msống tệp tin my_document.txt trên Desktop lên sẽ thấy kí từ bỏ "A" đã được ghi vào, đồng thời 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 vì nhỏ trỏ f cho đến Khi gặp 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 msinh hoạt file my_document.txt nghỉ ngơi thỏng mục Desktop sẽ thấy kí trường đoản cú "A" cơ hội nãy không thể nữa, cầm vào đó là chuỗi kí trường đoản cú "hello".

Xem thêm: Chăm Sóc Trẻ Sốt Phát Ban Đúng Cách Điều Trị Sốt Phát Ban Đúng Cách Tại Nhà

Read data from file

Đầu tiên bản thân sẽ khởi tạo một hàm khác có tên là readFromFile nlỗi sau:

void readFromFile(FILE *file)//read dataĐể làm cho những ví dụ trong phần này, mình đang Call hàm này sau khi đang Gọi 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 msống để vừa hiểu với ghi tệp tin, nên mình vẫn thực hiện mode "w+" (hoặc "r+").

Và dưới đấy là một trong những hàm được định nghĩa sẵn trong thỏng viện cstdio hỗ trợ chúng ta đọc dữ liệu vnạp năng lượng phiên bản từ file.

fgetc:

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

Reposition stream position indicator

Ghép những ví dụ sống bên trên lại, bọn họ tất cả một công tác đơn giản dễ dàng minh họa cho vấn đề ghi tệp tin cùng gọi từng chiếc dữ 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;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, hiệu quả đã cho ra screen không phải như mong muốn.

Nguyên ổn nhân là lúc bọn họ Điện thoại tư vấn hàm writeToFile và truyền vào kia bé trỏ tệp tin, vấn đề ghi tệp tin đang khiến internal file position indicator trỏ mang lại địa chỉ sau cuối trong tệp tin. Sau Lúc trở về hàm main, họ liên tiếp Điện thoại tư vấn hàm readFromFile với cùng một bé trỏ file. vì vậy, thời điểm họ hiểu tệp tin thì chúng ta lại ban đầu đọc tại địa chỉ hoàn thành file.

Để hạn chế điều này, chúng ta yêu cầu đóng góp con trỏ tệp tin lại cùng mlàm việc tạo một liên kết new bởi hàm fopen cùng với mode dùng để hiểu tệp tin. Tuy nhiên, làm điều này thì code xử lý của chúng ta đang dài thêm hơn nữa. Tlỗi viện cstdio sẽ cung ứng mang đến bọn họ hàm fseek để đổi khác địa chỉ trỏ cho vào file của internal file position indicator.

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

f là con trỏ trỏ đến đối tượng người tiêu dùng FILE đã mngơi nghỉ.

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

origin là địa điểm đặt bé trỏ vào file:

*

bởi thế, sau thời điểm call hàm writeToFile xong, chúng ta bắt buộc di chuyển internal tệp tin position indicator về đầu tệp tin bằng phương pháp nlỗi sau:

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

Determine form size of content of file

thường thì chúng ta phải phát âm toàn thể câu chữ của file vào một vùng lưu giữ bên trên Heap, bọn họ đang nên biết trước size văn bản bao gồm vào tệp tin nhằm cấp phát đầy đủ vùng lưu giữ trước khi hiểu tệp tin. Thỏng viện cstdio chỉ hỗ trợ đến họ hàm ftell:

long int ftell(FILE *f);Hàm này sẽ trả về vị trí của tệp tin indicator đang trỏ cho trong tệp tin (số bytes của văn bản file nhưng indicator đã trông nom qua).

do đó, những bạn cũng có thể đọc form size của văn bản vào tệp tin bằng phương pháp dịch internal tệp tin position indicator về địa điểm cuối cùng vào tệp tin rồi call hàm ftell:

__int64 size_of_file(FILE *file)fseek(file, 0, SEEK_END);__int64 size = ftell(file);fseek(tệp tin, 0, SEEK_SET);return size;Binary I/O functionsDưới đó là 2 hàm dùng để làm hiểu với ghi dữ liệu chỉ cần sử 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 để ghi dãy bit trong vùng nhớ được làm chủ vày nhỏ trỏ ptr vào tệp tin đang được trỏ bởi f, size là số bytes vẫn copy từ bỏ vùng lưu giữ của ptr và count là mốc giới hạn ghi vùng lưu giữ đó xuống file.

Hàm fwrite không quan tâm vùng lưu giữ của các bạn tất cả format gì, nó quyên tâm kích cỡ vùng nhớ phải phát âm cùng cứ vắt copy tất cả những bits với file, mỗi lần đang copy 1 blochồng of bit.

size_t fread(void *ptr, size_t kích cỡ, size_t count, FILE *f);Hàm fread vẫn copy count lần bloông xã of bits có size là form size, chuyển vào vùng nhớ được trỏ mang lại vày ptr, từ file đang rất được cai quản do f.

Sau khi hotline hàm fread, internal file position indicator đã dịch rời cho tới (size * count) bytes tự vị trí bắt đầu hiểu 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 chương trình trên đã cho ra tác dụng là không ít kí từ rác rến.

Nlỗi chúng ta thấy, hàm fread phát âm đúng 255 bytes vào tệp tin để mang vào vùng ghi nhớ của ptr bắt buộc những quý hiếm vượt lộ diện. Trong trường đúng theo này, sử dụng hàm fread với fwrite không tương xứng. Hàm fread với fwrite thường được dùng để hiểu và ghi tài liệu đẳng cấp struct vào tệp tin.

Write and read structs

Mình vẫn không thay đổi cấu trúc cmùi hương trinch như bên trên và chỉ thay đổi code trong hàm writeToFile và readFromFile.

Trước không còn, mình tạo thành một struct đơn giản và dễ dàng nhỏng 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 vì chưng bí quyết tổ chức triển khai dữ liệu trong struct còn liên quan cho quan niệm struct alignment). Như vậy là mỗi unit có vẻ bên ngoài Employee được tạo nên phần lớn chiếm một vùng lưu giữ tất cả kích cỡ 56 bytes.

Các chúng ta thử tưởng tượng nếu họ sử dụng những hàm ghi tệp tin nlỗi fputs, fprintf... thì form size tên của mỗi cá nhân đang không giống nhau dẫn cho họ không tồn tại một định dạng tầm thường nhằm dễ dàng thống trị những Employee vào file. Việc đặt chúng nó vào trong 1 struct góp chúng ta đọc và ghi tệp tin dễ dàng hơn nhiều.

Xem thêm: Cách Tắt Thông Báo Cập Nhật Ios 12 Trên Iphone Đơn Giản Nhất

Dưới đó là một quãng công tác mẫu mang đến bài toán cách xử trí 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(file, 0, SEEK_SET);readFromFile(file);fclose(file);return 0;Các các bạn chạy thử đoạn chương trình bên trên để thấy hiệu quả.

Bây tiếng bọn họ cùng msinh hoạt file my_document.txt vào thư mục Desktop để xem test văn bản vào tệp tin như vậy nào: