Đọc ghi file trong c

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

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

Trong bài học này, họ sẽ cùng mày mò về những tư tưởng về File cùng cách để làm việc cùng với File trong ngôn ngữ lập trình sẵn C/C++.

File

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

Đó là một trong những vài ba ví dụ cho biết sự sống thọ của File trong máy tính xách tay. Vậy thì chúng ta vẫn thao tác cùng với phần nhiều File đó như vậy nào?

Làm vấn đề với File chúng ta chỉ bao gồm những thao tác làm việc cơ phiên bản như: chế tác tệp tin mới, gọi dữ liệu trong tệp tin, ghi dữ liệu vào file, xóa tệp tin... Và bọn họ làm điều này từng ngày, lúc họ chơi trò giải trí, lúc chứng kiến tận mắt phlặng trên máy tính xách tay, ... với trong cả khi họ xây dựng, mã nguồn của bọn họ được lưu lại xuống File mã mối cung cấp Khi dìm tổng hợp phím Ctrl + S.

Theo quan niệm trên Wikipedia về computer file: Một tệp tin trên laptop là một trong những tài nguim dùng để lưu trữ công bố lâu hơn, sử dụng cho những chương trình máy vi tính.

Cũng y hệt như Việc lưu trữ dữ liệu tạm thời trên RAM, tệp tin cũng lưu trữ tài liệu bên dưới dạng nhị phân (0 hoặc 1), tuy vậy tùy thuộc theo định dạng của file và biện pháp thay đổi của mỗi ứng dụng hiểu file cơ mà họ bao hàm loại thông báo không giống nhau. ví dụ như tệp tin .png thì được gửi về hình trạng ả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 C/C++: File là kiểu dáng đối tượng, nó khẳng định một stream với chứa các biết tin cần thiết để điều khiển và tinh chỉnh, bao gồm một bé trỏ trỏ đến buffer của nó, những chỉ mục cùng trạng thái của nó.

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

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

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

Trong bài học kinh nghiệm này, mình sẽ khuyên bảo chúng ta thực hiện những làm việc như msinh sống file, hiểu cùng ghi tài liệu trong file... Chúng ta cần thao tác làm việc bên trên một tệp tin rõ ràng làm sao đó cần mình sẽ tạo một tệp tin với tên file là my_document.txt trong thư mục Desktop tất cả đường dẫn trên đồ vật bản thân là: C:/Users/ADMIN/Desktop/my_document.txt

Để làm việc với tệp tin, chúng ta nên biết vị trí của file (thông qua con đường dẫn) nhằm con trỏ giao diện FILE rất có thể tạo được luồng dữ liệu giữa người tiêu dùng với file trên đồ vật 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Để mtại 1 tệp tin, các chúng ta cũng có thể thực hiện hàm fopen được quan niệm vào thỏng viện cstdio:

FILE* fopen(const char *tệp tin, const char *mode);Hàm fopen chất nhận được tạo thành một kết nối mang lại file cùng với đường truyền được lưu trữ do tsay đắm 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 thành cùng với thương hiệu tệp tin nlỗi vào băng thông. Tham mê số sản phẩm nhì xác định loại truy cập vào file. Bảng dưới đây liệt kê những mode dùng để làm mở 1 file vào C:


*

Nếu mở tệp tin thành công xuất sắc, một tác động của một đối tượng người dùng mẫu mã FILE sẽ được trả về. Nếu mnghỉ ngơi 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 trên, mình msống tệp tin đã tạo nên sẵn vào thỏng mục Desktop với mode "r" (chỉ dùng để làm hiểu dữ liệu).

Các bạn phải lưu ý rằng tệp tin trong laptop sống thọ ở hai dạng: file văn bản và file bị mã hóa.

File văn bản là đa số file mà lại những bạn có thể phát âm được khi mngơi nghỉ bởi các trình soạn thảo vnạp năng lượng bản, thông thường phần đa tệp tin này được định hình Unicode (hoặc số đông format sử dụng mang đến văn uống phiên bản khác).

File bị mã hóa (thường gọi là tệp tin nhị phân) tất yêu đọc được Lúc msống file bởi các trình biên soạn thảo văn bạn dạng. Sử dụng File bị mã hóa góp bọn họ bảo mật tài liệu giỏi hơn File văn phiên bản.

Các mode mà mình đã liệt kê ngơi nghỉ bảng bên trên chỉ dùng làm thao tác làm việc cùng với file vnạp năng lượng phiên bản. Khi thao tác làm việc cùng với tệp tin bị mã hóa (tệp tin nhị phân), các bạn nên nối thêm kí trường đoản cú 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", ...

Cđại bại file

Sau Lúc thao tác với file hoàn thành, các bạn cần đóng góp tệp tin lại để rời hồ hết lỗi gây ra ngoài ý ước ao. Để đóng file, họ áp dụng hàm fclose:

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

Write data to file

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

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

void writeToFile(FILE *file);Hàm này sẽ tiến hành Điện thoại tư vấn sau khi msinh sống file với trước lúc đóng file.

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 tiếng, bọn họ chỉ quan tâm đến câu chữ bên phía trong hàm writeToFile.

Để ghi tài liệu vào file, bọn họ tất cả các hà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 đã ghi ký trường đoản cú có mã ASCII là c vào tệp tin được trỏ cho bởi vì con trỏ f. Giá trị trả về là EOF trường hợp ghi dữ liệu thua cuộc, trả về mã ASCII của kí từ bỏ được ghi vào giả dụ triển khai thành công.

Ví dụ:

void writeToFile(FILE *file)int c = fputc("A", file);std::cout << c << std::endl;Sau khi chạy lịch trình dứt, chúng ta mngơi nghỉ tệp tin my_document.txt bên trên Desktop lên đã thấy kí trường đoản cú "A" đã làm được ghi vào, bên cạnh đó trên console cũng in ra mã ASCII của kí từ bỏ "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 bởi vì nhỏ trỏ f cho tới khi chạm mặt 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 mlàm việc file my_document.txt sinh hoạt tlỗi mục Desktop sẽ thấy kí trường đoản cú "A" thời điểm nãy không còn nữa, nuốm vào chính là chuỗi kí từ bỏ "hello".

Xem thêm: Download Game Anh Hùng Đại Chiến 6, Siêu Anh Hùng Đại Chiến 5 Hack

Read data from file

Trước tiên bản thân sẽ khởi tạo một hàm không giống mang tên là readFromFile nhỏng sau:

void readFromFile(FILE *file)//read dataĐể có tác dụng các ví dụ trong phần này, bản thân đang gọi hàm này sau khoản thời gian vẫn 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);Lúc này, tệp tin của chúng ta được msinh sống nhằm vừa gọi cùng ghi file, đề xuất bản thân sẽ thực hiện mode "w+" (hoặc "r+").

Và dưới đấy là một số hàm được quan niệm sẵn vào tlỗi viện cstdio cung ứng chúng ta đọc tài liệu văn bạn dạng từ tệp tin.

fgetc:

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

Reposition stream position indicator

Ghxay những ví dụ ngơi nghỉ bên trên lại, chúng ta bao gồm một công tác dễ dàng và đơn giản minc họa mang lại câu hỏi ghi file và hiểu từng chiếc dữ liệu (line by line) đã có ghi vào tệp tin 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, hiệu quả cho ra màn hình không giống như mong muốn.

Nguyên nhân là lúc chúng ta Gọi hàm writeToFile cùng truyền vào đó nhỏ trỏ tệp tin, câu hỏi ghi tệp tin vẫn khiến cho internal tệp tin position indicator trỏ mang đến địa chỉ cuối cùng trong file. Sau Khi quay trở về hàm main, họ liên tục Call hàm readFromFile với 1 nhỏ trỏ file. Như vậy, cơ hội chúng ta gọi file thì bọn họ lại bước đầu phát âm trên địa chỉ xong file.

Để khắc phục vấn đề này, chúng ta đề xuất đóng góp con trỏ tệp tin lại cùng mngơi nghỉ sinh sản một liên kết bắt đầu bằng hàm fopen với mode dùng làm hiểu file. Tuy nhiên, làm cho điều này thì code giải pháp xử lý của họ đã dài hơn. Thỏng viện cstdio đang cung cấp cho chúng ta hàm fseek để thay đổi địa chỉ trỏ đến trong file của internal file position indicator.

int fseek(FILE *f, long int offphối, int origin);Trong đó:

f là bé trỏ trỏ mang lại đối tượng FILE đang mlàm việc.

offphối là số bytes được cộng thêm tính trường đoản cú vị trí origin.

origin là vị trí đặt con trỏ trong file:

*

Vậy nên, sau khoản thời gian call hàm writeToFile xong, bọn họ đề xuất di chuyển internal tệp tin position indicator về đầu file bằng phương pháp nhỏng sau:

writeToFile(file);fseek(tệp tin, 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 giống như các gì chúng ta sẽ ghi vào tệp tin.

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

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

long int ftell(FILE *f);Hàm này đang trả về địa điểm của file indicator đang trỏ đến vào file (số bytes của nội dung tệp tin cơ mà indicator đang coi xét qua).

bởi thế, những chúng ta có thể gọi kích cỡ của ngôn từ trong file bằng cách dịch internal file position indicator về vị trí sau cùng trong file rồi gọi hàm ftell:

__int64 size_of_file(FILE *file)fseek(file, 0, SEEK_END);__int64 form 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 cùng ghi dữ liệu chỉ cần sử dụng mang đế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 hàng bit vào vùng nhớ được thống trị bởi vì bé trỏ ptr vào tệp tin đang rất được trỏ bởi vì f, kích cỡ là số bytes vẫn copy trường đoản cú vùng ghi nhớ của ptr và count là số lần ghi vùng lưu giữ kia xuống tệp tin.

Hàm fwrite ko quan tâm vùng nhớ của chúng ta có format gì, nó quan tâm size vùng lưu giữ cần đọc với cđọng nỗ lực copy toàn bộ các bits cùng tệp tin, những lần sẽ copy 1 blochồng of bit.

size_t fread(void *ptr, size_t size, size_t count, FILE *f);Hàm fread đã copy count lần blochồng of bits bao gồm kích thước là kích thước, gửi vào vùng ghi nhớ được trỏ cho bởi ptr, từ tệp tin đang rất được thống trị vì chưng f.

Sau lúc Gọi hàm fread, internal file position indicator sẽ dịch chuyển cho tới (kích cỡ * count) bytes trường đoản cú địa chỉ bước đầ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;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;Chạy công tác trên cho ra công dụng là không hề ít kí từ rác.

Nlỗi chúng ta thấy, hàm fread hiểu đúng 255 bytes trong file để đưa vào vùng nhớ của ptr buộc phải các quý giá vượt mở ra. Trong ngôi trường hòa hợp này, dùng hàm fread với fwrite không phù hợp. Hàm fread và fwrite thường xuyên được dùng để làm phát âm cùng ghi dữ liệu kiểu dáng struct vào file.

Write và read structs

Mình vẫn không thay đổi kết cấu chương trinh nhỏng bên trên và chỉ biến hóa code trong hàm writeToFile và readFromFile.

Trước hết, bản thân sinh sản một struct dễ dàng nlỗi 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 vì chưng cách tổ chức triển khai tài liệu trong struct còn liên quan cho khái niệm struct alignment). bởi thế là từng unit gồm loại Employee được tạo nên gần như chiếm phần một vùng ghi nhớ gồm size 56 bytes.

Các bạn thử tưởng tượng giả dụ chúng ta áp dụng những hàm ghi file như fputs, fprintf... thì kích cỡ thương hiệu của mọi người sẽ khác biệt dẫn mang đến họ không có một định hình chung để dễ cai quản nhiều Employee vào file. Việc đặt nó vào trong một struct giúp bọn họ đọc với ghi file dễ ợt hơn nhiều.

Dưới đó là một đoạn công tác mẫu mang lại vấn đề giải pháp xử lý file để 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 Dinh 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 chúng ta chạy thử đoạn lịch trình bên trên để thấy công dụng.

Bây tiếng chúng ta thuộc msinh sống tệp tin my_document.txt trong tlỗi mục Desktop giúp xem demo văn bản trong tệp tin như vậy nào: