Bài tập liên quan đến đọc và ghi file năm 2024

Bài 1 :Hãy lập chương trình tạo một tệp số nguyên chứa các số nguyên tố nhỏ hơn 10000 theo thứ tự tăng dần .

Bài 2 :Cho f là tệp văn bản chứa các xâu 10 kí tự . Hãy lập chương trình nhập và hiển thị nội dung file đó lên màn hình , mỗi xâu một dòng , đầy trang màn hình thì dừng lại đợi gõ Enter mới hiển thị trang tiếp theo cho tới hết.

Bài 3 :Bạn hãy viết chương trình cho phép đọc dữ liệu từ bàn phím và ghi thêm vào cuối một tệp các bản ghi .

Bài 4 :Cho một văn bản chứa trong một text file f . Trong văn bản , tính từ trái sang phải , từ trên xuống dưới , kí tự # là kí hiệu xoá đi một từ đứng ngay trước nó nếu có . Ví dụ ‘

Ta

oi di ngu

h

hoc’ có nghĩa là ‘Toi di hoc’ . Bạn hãy viết chương trình sửa lại file f theo quy ước trên .

Bài 5 :Cho 2 file f và g cùng kiểu ( nhưng không rõ kiểu nào ) . Bạn hãy lập thủ tục gán nội dung của file g cho file f.

Bài 6 :Cho một file text ghi lại một chương trình Pascal của một học sinh . Hãy viết chương trình kiểm tra lỗi của chương trình Pascal trên theo các cách sau đây : Cách 1 : Kiểm tra xem số lượng các dấu ‘ ( dấu mở và dấu đóng ) có bằng nhau không ? Cách 2 : Kiểm tra xem số lượng các từ Begin và End có bằng nhau không ?

Bài 7 :Cho một file text . Hãy viết chương trình đếm xem file text trên chứa bao nhiêu từ . ( Chú ý : theo quy định , các từ cách nhau bởi một hay nhiều dấu cách ) .

Đọc và ghi file là những kĩ thuật quan trọng và sử dụng rất nhiều trong lập trình. Hầu như không có một ứng dụng nào có giá trị sử dụng mà không sử dụng đến những kĩ thuật này. Khi bạn làm một game, bạn cần đọc file để tải map, hoặc lưu lại điểm save. Khi làm một ứng dụng quản lý, việc lưu trữ các thông tin quan trọng vào file còn quan trọng hơn nữa. Dự án của bạn càng lớn, thì việc xử lý file càng nhiều và phức tạp. Do đó, thành thạo trong việc thao tác với file là một điều rất cần thiết.

Tiền đề bài viết

Khi tôi làm việc trên các dự án game khác nhau, tôi thường phải thao tác với rất nhiều file với nhiều định dạng như: hình ảnh, âm thanh, text… Thông qua quá trình đó, tôi đã tích lũy cho mình một số kinh nghiệm nhất định trong vấn đề này và qua bài viết này tôi muốn chia sẻ nó với các bạn.

Trong giới hạn bài viết này, tôi sử dụng ngôn ngữ C++ cùng thư viện chuẩn của C -stdio.h để bạn đọc dễ dàng hiểu rõ hơn bản chất của đọc ghi file.

Đối tượng hướng đến

Bài viết hướng đến đối tượng là lập trình viên mới làm quen với ngôn ngữ C++, và những người muốn hiểu rõ hơn về bản chất của đọc ghi file.

Mở file bằng fopen()

Công việc đầu tiên là phải include thư viện stdio.h - thư viện chuẩn của C có đầy đủ các phương thức để đọc và ghi file

Cú pháp của fopen()

  1. FILE *fopen(const char *_Filename, const char *_Mode);

Trong đó: _Filename là tên của file hoặc đường dẫn đến file cần mở. _Mode là các chế độ để xử lý file

Ta có các mode sau:

Mode Mô tả "r" Mở một file có sẵn để đọc "w" Tạo file mới để ghi, nếu file có sẵn thì sẽ bị ghi mới hoàn toàn "a" Mở một file để ghi từ vị trí cuối cùng của file, nếu file không tồn tại sẽ tạo mới "r+" Mở một file có sẵn để đọc và ghi "w+" Tạo file mới để đọc và ghi, nếu file có sẵn thì sẽ bị ghi mới hoàn toàn "a+" Mở một file để để đọc và ghi. Có thể đọc từ đầu file, nhưng khi ghi thì ghi từ vị trí cuối cùng của file, nếu file không tồn tại sẽ tạo mới

Ngoài ra, còn có các mode để xử lý file nhị phân như sau: “rb”, “wb”, “ab”, “rb+”, “wb+”, “ab+”, “r+b”, “a+b”

Hàm fopen() sẽ trả về NULL khi không mở được file, ví dụ trong trường hợp file bị xóa.

Đọc và ghi file thông thường

Ví dụ ta có file info.text nội dung như sau và ta muốn xuất thông tin ra màn hình:

  1. Kevin 19
  2. Brian 5
  3. Taco 8
  4. Amy 10
  5. Rye 13
  6. MinhHieu 4

Ta làm như sau:

  1. int main()
  2. {
  3. FILE *fp = fopen("info.txt", "r");
  4. if (fp == NULL)
  5. {
  6. printf("Can't open file!");
  7. }
  8. char Author[20];
  9. int NumberOfArticles;
  10. while (fscanf(fp, "%s %d", Author, &NumberOfArticles) != EOF)
  11. {
  12. printf("%s %d\n", Author, NumberOfArticles);
  13. }
  14. fclose(fp);
  15. return 0;
  16. }

Trong đó:

  1. int fscanf(const char *_Filename, const char *_Format, ...);

Hàm này có tác dụng giống như scanf(), nhưng đọc dữ liệu từ file theo _Format chứ không phải từ bàn phím như scanf(). fscanf() sẽ trả về EOF (End Of Flie) khi đọc đến cuối file.

Tương tự hàm fprintf() sẽ có chức năng tương tự như printf(), ghi dữ liệu vào file theo_Format.

Hàm fclose() là hàm bắt buộc phải sử dụng khi bạn hoàn thành thao tác với 1 file - đóng file đó lại sau khi đã xử lý xong.

Đọc và ghi file theo nhị phân

Theo như các kiến thức mà tôi nghiên cứu, thì mọi file thực chất đều là file nhị phân, vì vậytôi khuyến khích các bạn sử dụng cách này để thao tác với file.

Cách làm của tôi như sau, tôi xây dựng 1 hàm đọc để đọc file theo kiểu nhị phân, hàm sẽ trả về 1 mảng kiểu char để lưu toàn bộ dự liệu của file:

  1. char *ReadFile(const char* FilePath, long &fileSize)
  2. {
  3. FILE *pFile = fopen(FilePath, "rb");
  4. if (pFile == NULL)
  5. {
  6. return NULL;
  7. }
  8. fseek(pFile, 0, SEEK_END);
  9. fileSize = ftell(pFile);
  10. fseek(pFile, 0, SEEK_SET);
  11. char *buff = new char[fileSize];
  12. fread(buff, fileSize, 1, pFile);
  13. fclose(pFile);
  14. return buff;
  15. }

Ta chú ý một số điểm sau:

  1. fseek(pFile, 0, SEEK_END);

Bạn tưởng tượng có 1 con trỏ văn bản đang nhấp nháy ở trong file, thì hàm này sẽ đưa vị trí của con trỏ đó về cuối file.

  1. fileSize = ftell(pFile);

Hàm ftell() sẽ trả về số bytes tính từ đầu file đến vị trí của con trỏ văn bản, do tác dụng của hàm fseek() phía trên mà ta sẽ lấy được kích thước của file.

  1. fseek(pFile, 0, SEEK_SET);

Hàm này sẽ đưa vị trí của con trỏ đó về đầu file.

  1. size_t fread(void *ptr, size_t size_of_elements,
  2. size_t size_of_an_element,
  3. FILE *_File);

Ta dùng hàm fread() để đọc dữ liệu từ File vào mảng ptr, với tham số truyền vào là tổng kích thước cần đưa và kích thước của từng phần tử dữ liệu, ở đây ta dùng mảng char và muốn đưa toàn bộ nên hàm sẽ là

  1. fread(buff, fileSize, 1, pFile);

Tương tự ta ghi 1 file, ví dụ ta ghi dòng chữ Hello World! vào file D:\hello.txt theo kiểu nhị phân như sau:

  1. FILE *pFile = fopen("hello.txt", "wb");
  2. if (pFile == NULL)
  3. {
  4. printf("Can't open file!");
  5. return;
  6. }
  7. char *Hello = "Hello World!";
  8. fwrite(Hello, strlen(Hello), 1, pFile);
  9. fclose(pFile);

Source

  1. Khai báo

1

  1. Mở tập tin

2

Ví dụ : FILE *f; // Khai bao bien con tro f

3

Các kiểu truy nhập tập tin thông dụng:

t là kiểu truy nhập tập tin đối với dạng tập tin văn bản (text).

b là kiểu truy nhập tập tin đối với dạng tập tin nhị phân (binary).

r mở ra để đọc ( ready only).

w mở ra để ghi (create / write).

a mở ra để them vào (append).

r+ mở ra để đọc và ghi (modify).

  1. Các hàm đọc ghi nội dung tập tin

- See more at: https://expressmagazine.net/development/1756/huong-dan-lam-viec-voi-tap-tin-trong-c

sthash.v5Z0cYiO.dpuf