Lập trình máy tính - Tệp I / O
Tập tin máy tính
Tệp máy tính được sử dụng để lưu trữ dữ liệu ở định dạng kỹ thuật số như văn bản thuần túy, dữ liệu hình ảnh hoặc bất kỳ nội dung nào khác. Các tệp máy tính có thể được tổ chức bên trong các thư mục khác nhau. Tệp được sử dụng để giữ dữ liệu kỹ thuật số, trong khi thư mục được sử dụng để giữ tệp.
Các tệp máy tính có thể được coi là đối tác kỹ thuật số của các tài liệu giấy. Trong khi lập trình, bạn giữ mã nguồn của mình trong các tệp văn bản có phần mở rộng khác nhau, ví dụ: tệp lập trình C kết thúc bằng phần mở rộng.c, Các tệp lập trình Java với .javavà các tệp Python với .py.
Đầu vào / đầu ra tệp
Thông thường, bạn tạo tệp bằng các trình soạn thảo văn bản như notepad, MS Word, MS Excel hay MS Powerpoint,… Tuy nhiên, nhiều khi chúng ta cũng cần tạo tệp bằng các chương trình máy tính. Chúng tôi có thể sửa đổi tệp hiện có bằng chương trình máy tính.
Đầu vào tệp nghĩa là dữ liệu được ghi vào tệp và đầu ra tệp có nghĩa là dữ liệu được đọc từ tệp. Trên thực tế, các thuật ngữ đầu vào và đầu ra liên quan nhiều hơn đến đầu vào và đầu ra của màn hình. Khi chúng ta hiển thị một kết quả trên màn hình, nó được gọi là kết quả đầu ra. Tương tự, nếu chúng ta cung cấp một số đầu vào cho chương trình của mình từ dấu nhắc lệnh, thì nó được gọi là đầu vào.
Bây giờ, đủ để nhớ rằng ghi vào tệp là đầu vào của tệp và đọc thứ gì đó từ tệp là đầu ra của tệp.
Chế độ hoạt động tệp
Trước khi bắt đầu làm việc với bất kỳ tệp nào bằng chương trình máy tính, chúng ta cần tạo một tệp mới nếu nó không tồn tại hoặc mở một tệp đã có. Trong cả hai trường hợp, chúng tôi có thể mở tệp ở các chế độ sau:
Read-Only Mode- Nếu bạn định chỉ đọc một tệp hiện có và bạn không muốn ghi thêm bất kỳ nội dung nào vào tệp, thì bạn sẽ mở tệp ở chế độ chỉ đọc. Hầu như tất cả các ngôn ngữ lập trình đều cung cấp cú pháp để mở tệp ở chế độ chỉ đọc.
Write-Only Mode- Nếu bạn định ghi vào tệp hiện có hoặc tệp mới được tạo nhưng bạn không muốn đọc bất kỳ nội dung đã viết nào từ tệp đó, thì bạn sẽ mở tệp ở chế độ chỉ ghi. Tất cả các ngôn ngữ lập trình đều cung cấp cú pháp để mở tệp ở chế độ chỉ ghi.
Read & Write Mode - Nếu bạn định đọc cũng như ghi vào cùng một tệp, thì bạn sẽ mở tệp ở chế độ đọc và ghi.
Append Mode- Khi bạn mở một tệp để ghi, nó cho phép bạn bắt đầu ghi từ đầu tệp; tuy nhiên nó sẽ ghi đè lên nội dung hiện có, nếu có. Giả sử chúng ta không muốn ghi đè bất kỳ nội dung hiện có nào, thì chúng ta mở tệp ở chế độ nối thêm. Chế độ nối cuối cùng là một chế độ ghi, cho phép nội dung được thêm vào ở cuối tệp. Hầu như tất cả các ngôn ngữ lập trình đều cung cấp cú pháp để mở tệp ở chế độ nối thêm.
Trong các phần sau, chúng ta sẽ học cách mở một tệp mới hoàn toàn, cách ghi vào tệp đó và sau đó, cách đọc và nối thêm nội dung vào cùng một tệp.
Mở tệp
Bạn có thể dùng fopen()chức năng tạo tệp mới hoặc mở tệp hiện có. Lời gọi này sẽ khởi tạo một đối tượng kiểuFILE, chứa tất cả thông tin cần thiết để kiểm soát luồng. Đây là nguyên mẫu, tức là chữ ký của lệnh gọi hàm này -
FILE *fopen( const char * filename, const char * mode );
Đây, filename là chuỗi ký tự, bạn sẽ sử dụng để đặt tên tệp của mình và truy cập mode có thể có một trong các giá trị sau:
Sr.No | Chế độ & Mô tả |
---|---|
1 | r Mở tệp văn bản hiện có cho mục đích đọc. |
2 | w Mở tệp văn bản để viết. Nếu nó không tồn tại, thì một tệp mới sẽ được tạo. Tại đây, chương trình của bạn sẽ bắt đầu ghi nội dung từ đầu tệp. |
3 | a Mở tệp văn bản để viết ở chế độ thêm. Nếu nó không tồn tại, thì một tệp mới sẽ được tạo. Tại đây, chương trình của bạn sẽ bắt đầu thêm nội dung vào nội dung tệp hiện có. |
4 | r+ Mở tệp văn bản để đọc và ghi cả hai. |
5 | w+ Mở tệp văn bản để đọc và viết. Đầu tiên, nó cắt ngắn tệp thành độ dài bằng 0, nếu nó tồn tại; nếu không sẽ tạo tệp nếu nó không tồn tại. |
6 | a+ Mở tệp văn bản để đọc và viết. Nó tạo ra một tệp, nếu nó không tồn tại. Việc đọc sẽ bắt đầu lại từ đầu, nhưng phần viết chỉ có thể được thêm vào. |
Đóng tệp
Để đóng một tệp, hãy sử dụng fclose( )chức năng. Nguyên mẫu của hàm này là -
int fclose( FILE *fp );
Các fclose( ) hàm trả về 0 khi thành công, hoặc EOF, ký tự đặc biệt, nếu có lỗi khi đóng tệp. Hàm này thực sự đưa mọi dữ liệu vẫn đang chờ xử lý trong bộ đệm vào tệp, đóng tệp và giải phóng bất kỳ bộ nhớ nào được sử dụng cho tệp. EOF là một hằng số được xác định trong tệp tiêu đềstdio.h.
Có nhiều chức năng khác nhau được cung cấp bởi thư viện chuẩn C để đọc và ghi một tệp tin theo từng ký tự hoặc dưới dạng một chuỗi có độ dài cố định. Hãy để chúng tôi xem một vài trong số họ trong phần tiếp theo.
Viết tệp
Dưới đây là hàm đơn giản nhất để ghi các ký tự riêng lẻ vào một luồng:
int fputc( int c, FILE *fp );
Chức năng fputc() ghi giá trị ký tự của đối số c vào luồng đầu ra được tham chiếu bởi fp. Nó trả về ký tự đã viết được viết trên thành công, nếu khôngEOFnếu có lỗi. Bạn có thể sử dụng các hàm sau để ghi một chuỗi kết thúc bằng null vào một luồng:
int fputs( const char *s, FILE *fp );
Chức năng fputs() viết chuỗi svào tệp được tham chiếu bởi fp. Nó trả về một giá trị không âm khi thành công, nếu khôngEOFđược trả lại trong trường hợp có bất kỳ lỗi. Bạn cũng có thể sử dụng chức năngint fprintf(FILE *fp,const char *format, ...)để ghi một chuỗi vào một tệp. Hãy thử ví dụ sau:
#include <stdio.h>
int main() {
FILE *fp;
fp = fopen("/tmp/test.txt", "w+");
fprintf(fp, "This is testing for fprintf...\n");
fputs("This is testing for fputs...\n", fp);
fclose(fp);
}
Khi đoạn mã trên được biên dịch và thực thi, nó sẽ tạo ra một tệp mới test.txt trong /tmpthư mục và viết hai dòng bằng cách sử dụng hai chức năng khác nhau. Hãy để chúng tôi đọc tập tin này trong phần tiếp theo.
Đọc tệp
Dưới đây là hàm đơn giản nhất để đọc từng ký tự trong tệp văn bản -
int fgetc( FILE * fp );
Các fgetc() hàm đọc một ký tự từ tệp đầu vào được tham chiếu bởi fp. Giá trị trả về là ký tự được đọc; hoặc trong trường hợp có bất kỳ lỗi nào, nó sẽ trả vềEOF. Hàm sau cho phép bạn đọc một chuỗi từ một luồng:
char *fgets( char *buf, int n, FILE *fp );
Chức năng fgets() đọc tối đa n - 1 ký tự từ luồng đầu vào được tham chiếu bởi fp. Nó sao chép chuỗi đã đọc vào bộ đệmbuf, nối một null ký tự để kết thúc chuỗi.
Nếu hàm này gặp ký tự dòng mới '\ n' hoặc EOF trước khi chúng đọc số ký tự tối đa, thì hàm này chỉ trả về các ký tự được đọc đến thời điểm đó, bao gồm cả ký tự dòng mới. Bạn cũng có thể dùngint fscanf(FILE *fp, const char *format, ...) để đọc các chuỗi từ một tệp, nhưng nó sẽ ngừng đọc sau khi gặp ký tự khoảng trắng đầu tiên.
#include <stdio.h>
main() {
FILE *fp;
char buff[255];
fp = fopen("/tmp/test.txt", "r");
fscanf(fp, "%s", buff);
printf("1 : %s\n", buff );
fgets(buff, 255, (FILE*)fp);
printf("2: %s\n", buff );
fgets(buff, 255, (FILE*)fp);
printf("3: %s\n", buff );
fclose(fp);
}
Khi đoạn mã trên được biên dịch và thực thi, nó sẽ đọc tệp được tạo trong phần trước và tạo ra kết quả sau:
1 : This
2 : is testing for fprintf...
3 : This is testing for fputs...
Hãy phân tích những gì đã xảy ra ở đây. Đầu tiênfscanf() phương pháp đọc Thisbởi vì sau đó, nó gặp phải một khoảng trống. Cuộc gọi thứ hai dành chofgets(), sẽ đọc dòng còn lại cho đến khi nó chạm vào cuối dòng. Cuối cùng, cuộc gọi cuối cùngfgets() đọc hết dòng thứ hai.
Tệp I / O trong Java
Java cung cấp bộ hàm phong phú hơn để xử lý Tệp I / O. Để biết thêm về chủ đề này, chúng tôi khuyên bạn nên xem Hướng dẫn Java của chúng tôi.
Ở đây, chúng ta sẽ thấy một chương trình Java đơn giản, tương đương với chương trình C đã giải thích ở trên. Chương trình này sẽ mở một tệp văn bản, viết một vài dòng văn bản vào đó và đóng tệp. Cuối cùng, cùng một tệp được mở và sau đó đọc từ một tệp đã được tạo. Bạn có thể thử thực hiện chương trình sau để xem kết quả:
import java.io.*;
public class DemoJava {
public static void main(String []args) throws IOException {
File file = new File("/tmp/java.txt");
// Create a File
file.createNewFile();
// Creates a FileWriter Object using file object
FileWriter writer = new FileWriter(file);
// Writes the content to the file
writer.write("This is testing for Java write...\n");
writer.write("This is second line...\n");
// Flush the memory and close the file
writer.flush();
writer.close();
// Creates a FileReader Object
FileReader reader = new FileReader(file);
char [] a = new char[100];
// Read file content in the array
reader.read(a);
System.out.println( a );
// Close the file
reader.close();
}
}
Khi chương trình trên được thực thi, nó tạo ra kết quả sau:
This is testing for Java write...
This is second line...
Tệp I / O bằng Python
Chương trình sau đây hiển thị cùng một chức năng để mở một tệp mới, ghi một số nội dung vào đó và cuối cùng, đọc cùng một tệp -
# Create a new file
fo = open("/tmp/python.txt", "w")
# Writes the content to the file
fo.write( "This is testing for Python write...\n");
fo.write( "This is second line...\n");
# Close the file
fo.close()
# Open existing file
fo = open("/tmp/python.txt", "r")
# Read file content in a variable
str = fo.read(100);
print str
# Close opened file
fo.close()
Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:
This is testing for Python write...
This is second line...