C Tệp I/O: Tạo, mở, đọc, ghi và đóng tệp
C Quản lý tập tin
Một File có thể được sử dụng để lưu trữ một khối lượng lớn dữ liệu liên tục. Giống như nhiều ngôn ngữ khác, 'C' cung cấp các chức năng quản lý tệp sau:
- Tạo một tập tin
- Mở một tập tin
- Đọc một tập tin
- Viết vào một tập tin
- Đóng tệp
Sau đây là các chức năng quản lý tập tin quan trọng nhất có sẵn trong 'C,'
chức năng | mục đích | |
---|---|---|
fopen() | Tạo một tập tin hoặc mở một tập tin hiện có | |
fclose () | Đóng tệp | |
fprintf() | Ghi một khối dữ liệu vào một tập tin | |
fscanf () | Đọc dữ liệu khối từ một tập tin | |
getc () | Đọc một ký tự từ một tập tin | |
putc () | Ghi một ký tự đơn vào một tập tin | |
nhận được () | Đọc một số nguyên từ một tập tin | |
cái thứ gì đó () | Viết một số nguyên vào một tập tin | |
fseek () | Đặt vị trí của con trỏ tệp tới một vị trí được chỉ định | |
kể lại () | Trả về vị trí hiện tại của con trỏ file | |
tua lại () | Đặt con trỏ tệp ở đầu tệp |
Cách tạo một tập tin
Bất cứ khi nào bạn muốn làm việc với một tập tin, bước đầu tiên là tạo một tập tin. Một tập tin không là gì ngoài không gian trong bộ nhớ nơi lưu trữ dữ liệu.
Để tạo một tệp trong chương trình 'C', cú pháp sau được sử dụng,
FILE *fp; fp = fopen ("file_name", "mode");
Trong cú pháp trên, tệp là cấu trúc dữ liệu được xác định trong thư viện chuẩn.
fopen là một hàm tiêu chuẩn được sử dụng để mở tệp.
- Nếu tệp không có trên hệ thống thì nó sẽ được tạo và sau đó được mở.
- Nếu một tập tin đã có sẵn trên hệ thống thì nó sẽ được mở trực tiếp bằng cách sử dụng chức năng.
fp là một con trỏ tệp trỏ đến tệp loại.
Bất cứ khi nào bạn mở hoặc tạo một tệp, bạn phải chỉ định những gì bạn sẽ làm với tệp đó. Một tệp trong lập trình 'C' có thể được tạo hoặc mở cho mục đích đọc/ghi. Một chế độ được sử dụng để chỉ định xem bạn có muốn mở tệp cho bất kỳ mục đích nào dưới đây không. Sau đây là các loại chế độ khác nhau trong lập trình 'C' có thể được sử dụng khi làm việc với tệp.
Chế độ tệp | Mô tả Chi tiết |
---|---|
r | Mở một tập tin để đọc. Nếu một tệp ở chế độ đọc thì sẽ không có dữ liệu nào bị xóa nếu tệp đã có trên hệ thống. |
w | Mở một tập tin để viết. Nếu một tệp ở chế độ ghi thì một tệp mới sẽ được tạo nếu tệp đó hoàn toàn không tồn tại. Nếu một tệp đã có sẵn trên hệ thống thì tất cả dữ liệu bên trong tệp sẽ bị cắt bớt và nó được mở cho mục đích ghi. |
a | Mở một tập tin trong chế độ nối thêm. Nếu một tập tin ở chế độ chắp thêm thì tập tin đó sẽ được mở. Nội dung trong tập tin không thay đổi. |
r+ | mở để đọc và viết từ đầu |
w+ | mở để đọc và ghi, ghi đè lên một tập tin |
a+ | mở để đọc và viết, nối thêm vào tập tin |
Trong cú pháp đã cho, tên tệp và chế độ được chỉ định dưới dạng chuỗi nên chúng phải luôn được đặt trong dấu ngoặc kép.
Ví dụ:
#include <stdio.h> int main() { FILE *fp; fp = fopen ("data.txt", "w"); }
Đầu ra:
Tệp được tạo trong cùng thư mục nơi bạn đã lưu mã của mình.
Bạn có thể chỉ định đường dẫn nơi bạn muốn tạo tệp của mình
#include <stdio.h> int main() { FILE *fp; fp = fopen ("D://data.txt", "w"); }
Cách đóng một tập tin
Người ta phải luôn đóng tệp bất cứ khi nào các thao tác trên tệp kết thúc. Nó có nghĩa là nội dung và liên kết đến tập tin bị chấm dứt. Điều này ngăn chặn sự hư hỏng do vô tình xảy ra với tập tin.
'C' cung cấp hàm fclose để thực hiện thao tác đóng tệp. Cú pháp của fclose như sau,
fclose (file_pointer);
Ví dụ:
FILE *fp; fp = fopen ("data.txt", "r"); fclose (fp);
Hàm fclose lấy con trỏ tệp làm đối số. Sau đó, tệp được liên kết với con trỏ tệp sẽ được đóng lại với sự trợ giúp của hàm fclose. Nó trả về 0 nếu đóng thành công và EOF (cuối tệp) nếu có lỗi xảy ra trong khi đóng tệp.
Sau khi đóng tệp, con trỏ tệp tương tự cũng có thể được sử dụng với các tệp khác.
Trong lập trình 'C', các tập tin sẽ tự động đóng khi chương trình kết thúc. Đóng tệp theo cách thủ công bằng cách viết hàm fclose là một cách lập trình tốt.
Ghi vào tệp
Trong C, khi bạn ghi vào một tập tin, các ký tự dòng mới '\n' phải được thêm vào một cách rõ ràng.
Thư viện stdio cung cấp các chức năng cần thiết để ghi vào tệp:
- fputc(char, file_pointer): Nó ghi một ký tự vào file được trỏ bởi file_pointer.
- fputs(str, file_pointer): Nó ghi một chuỗi vào file được trỏ tới bởi file_pointer.
- fprintf(file_pointer, str, biến_lists): Nó in một chuỗi tới tệp được trỏ bởi file_pointer. Chuỗi có thể tùy ý bao gồm các bộ xác định định dạng và danh sách các biến biến_lists.
Chương trình dưới đây hướng dẫn cách thực hiện việc ghi vào một tập tin:
Hàm fputc():
#include <stdio.h> int main() { int i; FILE * fptr; char fn[50]; char str[] = "Guru99 Rocks\n"; fptr = fopen("fputc_test.txt", "w"); // "w" defines "writing mode" for (i = 0; str[i] != '\n'; i++) { /* write to file using fputc() function */ fputc(str[i], fptr); } fclose(fptr); return 0; }
Đầu ra:
Chương trình trên ghi một ký tự vào fputc_test.txt tập tin cho đến khi gặp ký hiệu dòng tiếp theo “\n” cho biết câu đã được viết thành công. Quá trình này là lấy từng ký tự của mảng và ghi nó vào tệp.
- Trong chương trình trên, chúng tôi đã tạo và mở một tệp có tên fputc_test.txt ở chế độ ghi và khai báo chuỗi sẽ được ghi vào tệp.
- Chúng tôi thực hiện thao tác ghi từng ký tự bằng cách sử dụng vòng lặp for và đặt từng ký tự vào tệp của mình cho đến khi gặp ký tự “\n”, sau đó tệp được đóng bằng hàm fclose.
fputs() Chức năng:
#include <stdio.h> int main() { FILE * fp; fp = fopen("fputs_test.txt", "w+"); fputs("This is Guru99 Tutorial on fputs,", fp); fputs("We don't need to use for loop\n", fp); fputs("Easier than fputc function\n", fp); fclose(fp); return (0); }
Đầu ra:
- Trong chương trình trên, chúng tôi đã tạo và mở một tệp có tên fputs_test.txt ở chế độ ghi.
- Sau khi chúng ta thực hiện thao tác ghi bằng hàm fputs() bằng cách viết ba dây
- Sau đó, tập tin sẽ được đóng bằng hàm fclose.
fprintf()Chức năng:
#include <stdio.h> int main() { FILE *fptr; fptr = fopen("fprintf_test.txt", "w"); // "w" defines "writing mode" /* write to file */ fprintf(fptr, "Learning C with Guru99\n"); fclose(fptr); return 0; }
Đầu ra:
- Trong chương trình trên, chúng tôi đã tạo và mở một tệp có tên fprintf_test.txt ở chế độ ghi.
- Sau khi thao tác ghi được thực hiện bằng hàm fprintf() bằng cách viết một chuỗi, tệp sẽ được đóng bằng hàm fclose.
Đọc dữ liệu từ một File
Có ba chức năng khác nhau dành riêng cho việc đọc dữ liệu từ một tập tin
- fgetc(file_pointer): Nó trả về ký tự tiếp theo từ tệp được trỏ bởi con trỏ tệp. Khi đến cuối tệp, EOF sẽ được gửi lại.
- fgets(bộ đệm, n, con trỏ tệp): Nó đọc n-1 ký tự từ tệp và lưu trữ chuỗi trong bộ đệm trong đó ký tự NULL '\0' được thêm vào làm ký tự cuối cùng.
- fscanf(file_pointer, thông số chuyển đổi, địa chỉ biến): Nó được sử dụng để phân tích và phân tích dữ liệu. Nó đọc các ký tự từ tập tin và gán đầu vào cho một danh sách con trỏ biến biến_địa chỉ bằng cách sử dụng công cụ xác định chuyển đổi. Hãy nhớ rằng giống như scanf, fscanf dừng đọc chuỗi khi gặp dấu cách hoặc dòng mới.
Chương trình sau đây trình bày cách đọc từ tệp fputs_test.txt bằng các hàm fgets(), fscanf() và fgetc() tương ứng:
#include <stdio.h> int main() { FILE * file_pointer; char buffer[30], c; file_pointer = fopen("fprintf_test.txt", "r"); printf("----read a line----\n"); fgets(buffer, 50, file_pointer); printf("%s\n", buffer); printf("----read and parse data----\n"); file_pointer = fopen("fprintf_test.txt", "r"); //reset the pointer char str1[10], str2[2], str3[20], str4[2]; fscanf(file_pointer, "%s %s %s %s", str1, str2, str3, str4); printf("Read String1 |%s|\n", str1); printf("Read String2 |%s|\n", str2); printf("Read String3 |%s|\n", str3); printf("Read String4 |%s|\n", str4); printf("----read the entire file----\n"); file_pointer = fopen("fprintf_test.txt", "r"); //reset the pointer while ((c = getc(file_pointer)) != EOF) printf("%c", c); fclose(file_pointer); return 0; }
Kết quả:
----read a line---- Learning C with Guru99 ----read and parse data---- Read String1 |Learning| Read String2 |C| Read String3 |with| Read String4 |Guru99| ----read the entire file---- Learning C with Guru99
- Trong chương trình trên, chúng ta đã mở tệp có tên “fprintf_test.txt” được viết trước đó bằng hàm fprintf() và nó chứa chuỗi “Learning C with Guru99”. Chúng ta đọc nó bằng hàm fgets(), hàm này đọc từng dòng trong đó kích thước bộ đệm phải đủ để xử lý toàn bộ dòng.
- Chúng ta mở lại file để reset con trỏ file về điểm đầu file. Tạo các biến chuỗi khác nhau để xử lý từng từ riêng biệt. In các biến để xem nội dung của chúng. Hàm fscanf() chủ yếu được sử dụng để trích xuất và phân tích dữ liệu từ một tệp.
- Mở lại tệp để đặt lại con trỏ tệp về điểm đầu tệp. Đọc dữ liệu và in từ từng ký tự trong tệp bằng hàm getc() cho đến khi gặp câu lệnh EOF
- Sau khi thực hiện thao tác đọc tệp bằng các biến thể khác nhau, chúng tôi lại đóng tệp bằng hàm fclose.
Đọc và ghi tệp tương tác với getc và putc
Đây là những thao tác tập tin đơn giản nhất. Getc là viết tắt của ký tự get và putc là viết tắt của ký tự put. Hai hàm này được sử dụng để chỉ xử lý một ký tự tại một thời điểm.
Chương trình sau đây trình bày các chức năng xử lý tệp trong lập trình 'C':
#include <stdio.h> int main() { FILE * fp; char c; printf("File Handling\n"); //open a file fp = fopen("demo.txt", "w"); //writing operation while ((c = getchar()) != EOF) { putc(c, fp); } //close file fclose(fp); printf("Data Entered:\n"); //reading fp = fopen("demo.txt", "r"); while ((c = getc(fp)) != EOF) { printf("%c", c); } fclose(fp); return 0; }
Đầu ra:
- Trong chương trình trên, chúng tôi đã tạo và mở một tệp có tên demo ở chế độ ghi.
- Sau khi thao tác ghi được thực hiện, tệp sẽ được đóng bằng hàm fclose.
- Chúng tôi đã mở lại một tệp hiện chứa dữ liệu ở chế độ đọc. Vòng lặp while sẽ thực thi cho đến khi tìm thấy eof. Khi tìm thấy phần cuối của tệp, thao tác sẽ kết thúc và dữ liệu sẽ được hiển thị bằng chức năng printf.
- Sau khi thực hiện thao tác đọc, tệp sẽ được đóng lại bằng chức năng fclose.
Tổng kết
- Tệp là một khoảng trống trong bộ nhớ nơi lưu trữ dữ liệu.
- Lập trình 'C' cung cấp nhiều chức năng khác nhau để xử lý một tệp.
- Cơ chế thao tác với các tập tin được gọi là quản lý tập tin.
- Một tập tin phải được mở trước khi thực hiện các thao tác trên nó.
- Một tập tin có thể được mở ở chế độ đọc, ghi hoặc chắp thêm.
- Hàm Getc và putc được sử dụng để đọc và ghi một ký tự đơn.
- Hàm fscanf() cho phép đọc và phân tích dữ liệu từ một tệp
- Chúng ta có thể đọc (sử dụng cái getc chức năng) toàn bộ tệp bằng cách lặp để bao phủ tất cả tệp cho đến khi gặp EOF
- Chúng ta có thể ghi vào một tập tin sau khi tạo tên của nó bằng cách sử dụng hàm fprintf () và nó phải có ký tự dòng mới ở cuối chuỗi văn bản.