Bộ nhớ tệp trong ngôn ngữ C là một trong những yếu tố rất quan trọng, nó sẽ là nơi lưu trữ các dữ liệu cần thiết của chương trình C. Vậy cụ thể cách lưu trữ bộ nhớ C FILE I/O này thế nào thì cùng Box.edu tìm hiểu kỹ hơn ở bài viết này nhé!
Xem thêm: FOPEN in C – Cách mở tệp để đọc, ghi và sửa đổi
Xem thêm: Lập trình hướng đối tượng là gì? Hướng dẫn cách sử dụng
Xem thêm: Gợi ý 10 cuốn sách lập trình C++ cơ bản cho người mới
Mục lục bài viết
Nhập và xuất tệp bằng ngôn ngữ lập trình C
Nhập và xuất tệp bằng ngôn ngữ lập trình C
Tệp được biết đến là yếu tố cần thiết trong bộ nhớ máy tính chứa các dữ liệu của người dùng hoặc đại diện cho tài liệu người dùng. Các tệp này có thể là: hình ảnh, văn bản, âm thanh, video hoặc dữ liệu nhị phân khác. Hôm nay chúng tôi sẽ giới thiệu để giúp các bạn có thể đọc từ đĩa, ghi vào đĩa thông qua việc sử dụng giao diện C FILE I/O. So với những ngôn ngữ lập trình khác như java hay Python thì FILE I/O trong C vẫn đang ở mức cơ bản.
Các thao tác ra, vào tệp
Với những bạn mới tìm hiểu về ngôn ngữ C thì bạn có thể được lợi từ việc sử dụng trình biên dịch C trong các bước nhỏ. Trong Windows, bạn cũng có thể sử dụng chuỗi công cụ Mingw GNU và trình biên dịch Borland C / C ++ hoặc Microsoft Visual Studio hay shell trong Linux. Bắt đầu thực hiện bằng cách gõ vào shell,
$ gcc --version
Khi đó bạn sẽ thấy kết quả sau, tiếp theo bạn đã sẵn sàng đi sâu vào phát triển ngôn ngữ lập trình C.
Tại sao cần có C FILE I/O
- Khi một chương trình bị kết thúc, toàn bộ dữ liệu sẽ bị mất do đó lưu trữ trong một tệp sẽ bảo toàn được tất cả dữ liệu của bạn ngay cả khi chương trình kết thúc
- Nếu bạn phải nhập một số lượng lớn dữ liệu, bạn sẽ bị mất rất nhiều thời gian để nhập hết chúng. Tuy nhiên, nếu bạn có một tệp chứa tất cả dữ liệu, bạn cũng có thể dễ dàng truy cập vào nội dung của tệp bằng một vài lệnh trong C
- Ngoài ra bạn còn có thể dễ dàng di chuyển dữ liệu của mình từ máy tính này sang máy tính khác mà không có bất kỳ sự thay đổi nào
Các loại tệp C FILE I/O
Khi xử lý tệp, thông thường có hai loại tệp bạn nên biết đó là:
- Tệp văn bản
- Tệp nhị phân
Tệp văn bản
Tệp văn bản được hiểu là tệp .txt bình thường. Bạn có thể dễ dàng tạo các tệp văn bản bằng bất kỳ trình soạn thảo đơn giản nào như Notepad.
Đồng thời khi bạn mở các tệp đó, bạn sẽ thấy tất cả nội dung trong tệp dưới dạng văn bản thuần túy. Bạn có thể dễ dàng chỉnh sửa hoặc xóa nội dung.
Chúng cần nỗ lực tối thiểu để duy trì, dễ đọc và cung cấp ít bảo mật nhất và chiếm không gian lưu trữ lớn hơn.
Tệp nhị phân
Các tệp nhị phân chủ yếu là tệp .bin trong máy tính của bạn. Thay vì lưu trữ dữ liệu ở dạng văn bản thuần túy, họ lưu trữ nó ở dạng nhị phân (số 0 và số 1).
Chúng có thể chứa một lượng dữ liệu cao hơn, không thể đọc được dễ dàng và cung cấp khả năng bảo mật tốt hơn các tệp văn bản.
Tìm hiểu về API tệp trong C
Để bao gồm các hoạt động nhập – xuất tệp trong chương trình của bạn, ngoài ra bạn có thể thêm định nghĩa tệp tiêu đề,
#include <stdio.h>
trong đó cấu trúc FILE tồn tại và các chức năng của nó như sau:
- fopen – mở một tệp, trả về con trỏ cấu trúc FILE *
- fclose – đóng tệp được cung cấp con trỏ cấu trúc FILE * của fopen
- fprintf – in ra tệp
- fscanf – đọc từ tệp
- ftell – hiển thị vị trí trong luồng tệp
- fseek – goto bắt đầu luồng tệp hoặc kết thúc
Để biết thêm chi tiết, thì các bạn hãy đọc trang hướng dẫn sử dụng trên Linux để biết các chức năng khẳng định.
$ man fopen
cụ thể sẽ được hiển thị một trang như sau:
FOPEN (3) Sổ tay hướng dẫn lập trình viên Linux FOPEN (3)
TÊN
fopen, fdopen, freopen - phát trực tuyến các chức năng mở
TÓM TẮC
#include <stdio.h>
FILE * fopen (const char * đường dẫn, const char * mode);
void fclose (FILE *);
Các chức năng liên quan: Truy cập luồng
Một điều đặc biệt là bạn cũng có thể di chuyển trong luồng tệp bằng cách sử dụng các hàm, fseek, ftell và tua lại, tất cả đều được xác định trong cùng một tệp tiêu đề. Do đó để có thể biết chi tiết, hãy kéo trang hướng dẫn sau lên bằng cách gõ, $ man fseek.
FSEEK (3) Sổ tay hướng dẫn lập trình viên Linux FSEEK (3)
TÊN
fgetpos, fseek, fsetpos, ftell, tua lại - định vị lại luồng
TÓM TẮC
#include <stdio.h>
int fseek (FILE * stream, long offset, int whence);
long ftell (FILE * stream);
void rewind (FILE * stream);
Ví dụ về đọc tệp C FILE I/O
Ví dụ về đọc tệp C FILE I/O
Trong ví dụ này, chúng tôi đọc tệp trên UNIX có tên ‘/ etc / passwd’, là một phần mềm lịch sử với danh sách số lượng người dùng, mật khẩu được mã hóa và ID nhóm của họ. Khi chúng tôi bắt đầu mở tệp với thuộc tính đọc, thì “r” sẽ được trích xuất nội dung vào một bộ đệm ký tự, hay còn được gọi là biến ‘dữ liệu dòng’. Đồng thời chúng tôi cũng thực hiện một số cách xử lý để trích xuất tên người dùng – nội dung từ đầu dòng cho đến ký tự ‘:’ và in nó ra bảng điều khiển. Chúng tôi cũng giữ số lượng người dùng một cách cụ thể nhất.
Khi kết hợp tất cả những điều này lại với nhau, chúng ta thấy rằng danh sách ‘file_read.c’ được thể hiện như sau:
#include <stdio.h>
#include <khẳng định.h>
/ * trích xuất tên người dùng từ dòng / etc / passwd * /
int main () {
const char * fname = "/ etc / passwd";
FILE * fp = fopen (fname, "r");
khẳng định (fp! = NULL);
char line_data [512] = {0,}, * ptr = NULL;
int line_no = 0;
trong khi (! feof (fp)) {
fgets (dữ liệu dòng, 512, fp);
/ * xóa các phần của dòng sau ':' * /
ptr = dòng_dữ liệu;
while (* ptr! = ':') {
ptr ++;
}
* ptr = '';
/ * tên người dùng đầu ra * /
printf ("% d)% s \ n", line_no, line_data);
dòng_no ++;
}
printf ("Tổng # người dùng =% d \ n", line_no);
fclose (fp);
trả về 0;
}
Chạy chương trình
Bạn có thể tải xuống gói C cho nền tảng của mình từ trang web nguồn C.org, và chạy các bài kiểm tra và chương trình dưới dạng $ gcc file_read.c -o file_read && ./file_read, chính là lệnh để diễn giải mã và sau đó thực hiện việc các chạy chương trình
0) gốc
1) daemon
2) thùng rác
... <snip>
39) khách-r7Ir02
40) khách-r7Ir02
Tổng số # người dùng = 41
Ví dụ – Ghi vào tệp
Sử dụng API fprintf (), giống với API printf () trong C, nhưng có thêm đối số đầu tiên vì con trỏ FILE có thể được sử dụng để ghi dữ liệu vào đĩa. Bạn cũng cần mở một tệp có thuộc tính ghi, “w”. Trong ví dụ này, chúng tôi sẽ đặt tên tệp là “data.txt”. Kết hợp tất cả những điều này lại với nhau, chúng ta sẽ thấy một chương trình, ‘file_write.c’
#include <stdio.h>
#include <khẳng định.h>
/ * trích xuất tên người dùng từ dòng / etc / passwd * /
int main () {
const char * fname = "/ etc / passwd";
FILE * fp = fopen (fname, "r");
khẳng định (fp! = NULL);
char line_data [512] = {0,}, * ptr = NULL;
int line_no = 0;
FILE * fw = fopen ("data.txt", "w");
trong khi (! feof (fp)) {
fgets (dữ liệu dòng, 512, fp);
/ * xóa các phần của dòng sau ':' * /
ptr = dòng_dữ liệu;
while (* ptr! = ':') {
ptr ++;
}
* ptr = '';
/ * tên người dùng đầu ra * /
fprintf (fw, "% d)% s \ n", line_no, line_data);
printf ("% d)% s \ n", line_no, line_data);
dòng_no ++;
}
printf ("Tổng # người dùng =% d \ n", line_no);
fprintf (fw, "Tổng số người dùng =% d \ n", line_no);
fclose (fw);
fclose (fp);
trả về 0;
}
Đặc biệt khi bạn biên dịch và chạy chương trình, giống như trong phần trước, lúc này bạn sẽ nhận được một tệp mới trên đĩa có tên là “data.txt”. Tiếp theo bạn chỉ cần mở ra và đọc nó trong trình soạn thảo yêu thích của bạn.
Có thể nói các nhà phát triển phần mềm hiện nay đều sử dụng tệp làm bộ nhớ thứ cấp để lưu trữ dữ liệu liên tục. Khi chương trình bị đóng, thông thường, tất cả nội dung trong RAM sẽ bị biến mất. Đồng thời việc lưu trữ các tùy chọn của người dùng vào đĩa là một yêu cầu hoặc các kết quả trung gian của một quá trình tính toán dài, cũng như việc đọc lại chúng vào bộ nhớ khi ứng dụng của bạn đang chạy lại sau khi kết thúc hoặc tải lại không mong muốn. Thêm nữa bạn có thể tìm hiểu thêm về cơ sở dữ liệu để tính toán và lưu trữ. Các ứng dụng lưu trữ thứ cấp bao gồm sao lưu cơ sở dữ liệu và các tính năng của ứng dụng.
Tổng kết
Box.edu mong rằng những thông tin chia sẻ trên sẽ giúp bạn có thể nắm được những kiến thức cần thiết và quan trọng về bộ nhớ tệp C FILE I/O. Từ đó có thể thành thạo trong quá trình lưu trữ và thực hiện một cách chính xác và tốt nhất. Chúc các nhà lập trình viên thành công!