Chuyển đến nội dung chính

Bài 10. Xử lý file trong C++

 

Khái niệm

File là một loại “Tài liệu” nhằm lưu trữ dữ liệuthông tin. Có rất nhiều kiểu file khác nhau nhằm lưu dữ các kiểu dữ liệu và thông tin khác nhau, ví dụ như file text, file Excel, file Json, file XML, hay là file CSV v.v…

Để có thể thao tác với các loại file này, người dùng thông thường cần các phần mềm chuyên dùng để mở, đọc ghilưu chúng. Tuy nhiên thì với các lập trình viên như chúng ta thì bằng cách sử dụng sử dụng ngôn ngữ C++, chúng ta cũng có thể dễ dàng thực hiện các thao tác tương tự với file như vậy.

Thao tác với file

Đọc file

Cú pháp:
ifstream bientep("Đường dẫn tới tệp");
Ví dụ:

    ifstream f("C:\\input.inp");

Hoặc

    ifstream in("input.inp");


Ở ví dụ trên sử dụng đường dẫn tuyệt đối, với ví dụ ở dưới là đường dẫn tương đối chỉ sử dụng khi tệp và file chương trình nằm trong cùng thư mục mẹ.

Ví dụ trong thư tệp input.inp như sau:

    NT-CODER Wellcome
    2022


Ta thực hiện đọc file như sau:

#include <bits/stdc++.h>
using namespace std;
int main() {
    string str;
    int year;
    ifstream f("input.inp");
    getline(f, str);
    f >> year;
    f.close();
    cout << str << endl;
    cout << year << endl;
    system("pause");
}


Kết quả:


close(): Dù là đọc hay ghi file mỗi khi xong bạn cần phải thực hiện đóng file.
getline: đọc theo dòng nếu không sử dụng getline ta nhận được kết quả sau:


Bạn thấy không vậy nên để lấy cả dấu cách ta sử dụng getline.

Nhưng trong số bài toán có nhiều bài dữ liệu ta không thể sử dụng như vậy mà phải kết hợp với vòng for hoặc while để đọc.
Ví dụ tệp input.inp có dữ liệu là:
    
    5
    1
    6
    7
    8


Chương trình đọc file như sau:

#include <bits/stdc++.h>
using namespace std;
int main() {
    ifstream f("input.inp");
    while(!f.eof()) {
        int a;
        f >> a;
        cout << a << " ";
    }
    f.close();
    system("pause");
}

q

bientep.eof(): Trả về false khi chưa đến cuối file ngược lại là true.

Vòng lặp while với ý nghĩa khi chưa lặp đến cuối file thì vẫn tiếp tục thực hiện.

Kết quả


Đó là lặp với số lần không biết trước, đối với số lần biết trước ví dụ tệp gồm 3 số là ngày tháng và năm như sau:

    8 10 2022


Ta có thể sử dụng vòng for như sau:

#include <bits/stdc++.h>
using namespace std;
int main() {
    ifstream f("input.inp");
    for(int i = 1; i <= 3; i++) {
        int a;
        f >> a;
        cout << a << " ";
    }
    f.close();
    system("pause");
}


Kết quả:

Rất dễ có phải không nào?

Ghi file

Cú pháp:
ofstream bientep("Đường dẫn tới tệp");
Ví dụ:

    ofstream f("C:\\input.inp");

Hoặc

    ofstream in("input.inp");


Ví dụ: viết chương trình tính n giai thừa ghi vào tệp tên giaithua.out dữ liệu được lấy từ tệp giaithua.inp gồm 1 số nguyên n duy nhất trên 1 dòng.
Ta thực hiện như sau:

#include <bits/stdc++.h>
using namespace std;
long int giaithua(int n) {
    if(n == 0)
        return 1;
    return giaithua(n-1)*n;
}
int main() {
    int n, res;
    ifstream f("giaithua.inp");
    f >> n;
    f.close();
    res = giaithua(n);
    ofstream f2("giaithua.out");
    f2 << res;
    f2.close();
    system("pause");
}


Tệp giaithua.inp có nội dung la: 5
Kết quả ta nhận được 1 file giaithua.out có nội dung là: 120

Ngoài ra việc đọc hay ghi file có thể sử dụng fstream để thay thế từ khóa ifstreamofstream

Các mode đọc và ghi file

  • ios::app: Chế độ Append. Tất cả output tới file đó được phụ thêm vào cuối file đó
  • ios::ate: Mở một file cho output và di chuyển điều khiển read/write tới cuối của file
  • ios::in: Mở một file để đọc
  • ios::out: Mở một file để ghi
  • ios::trunc: Nếu file này đã tồn tại, nội dung của nó sẽ được cắt (truncate) trước khi mở file
Nếu không thêm gì ifstream sẽ mặc định là ios::inofstream sẽ mặc định là ios::out
Để kết hợp nhiều mode ta sử dụng dấu "|".
Ví dụ:
ofstream("output.out", ios::out | ios::app);

Vậy là đã kết thúc bài học hôm nay. Hãy để lại bình luận nếu vẫn còn thắc mắc.

Nhận xét

Bài đăng phổ biến từ blog này

Cài đặt C++ trên Sublime Text

Sublime Text  là một phần mềm soạn thảo code đang được rất nhiều nhà lập trình viên sử dụng bởi các tính năng cũng như hiệu năng mà nó mang lại. Không những nó vừa nhẹ, vừa gọn, vừa nhanh mà nó còn hỗ trợ rất nhiệu như plugins, snippets, code auto complete, highlight beautiful, tùy biến giao diện, phím tắt, và rất nhiều thứ khác nữa. Link tải Sublime Text:   Sublime Text - Text Editing, Done Right Link tải MinGW:   MinGW - Minimalist GNU for Windows - Browse /Installer at SourceForge.net Cài g++ và gdb: Bước 1 : Chọn mingw32-gcc-g++ ở mục Basic Setup Chọn mingw32-gdb ở mục All Packges. Bước 2 : Bấm Installation  chọn Update Catalogue và chọn Review Changes chọn Apply  đợi quá trình cài đặt. Bước 3 : Tìm đến thư mục C:\MinGW\bin  và copy link. Bước 4 : Phải chuột bảng chọn Start chọn Hệ Thống sau đó chọn vào Thiết lập hệ thống chuyên sâu Bước 5 : Chọn Environment Variables... Bước 6 : Ở phần Path bấm và chọn edit . Bước 7 : Nhấn chọn New và dán link vào và nhấn OK . Thêm Build Sy

Bài 7. Hàm trong C++

  Một hàm là một nhóm các câu lệnh cùng nhau thực hiện một nhiệm vụ. Mỗi chương trình C++ có ít nhất một hàm, là hàm main(). Hàm giúp cho code của trở nên ngắn gọn, dễ kiểm tra lỗi hơn . Một hàm có thể được gọi nhiều lần . Hàm phải được tạo ra trước khi gọi đến hoặc được khai báo trước đó. Định nghĩa hàm trong lập trình C++ bao gồm tên hàm và phần thân hàm . Dưới đây là tất cả các phần của hàm: Kieu_tra_ve Ten_ham(Danh sách tham số) {      Thân hàm  } Kieu_tra_ve : Một hàm có thể trả về một giá trị . Một số hàm thực hiện các hoạt động mong muốn mà k hông trả về một giá trị . Trong trường hợp này, từ khóa void thay thế cho kiểu trả về. Ten_ham : Đây là tên thực của hàm. Danh sách tham số : Một tham số giống như một trình giữ chỗ . Khi một hàm được gọi, bạn chuyển một giá trị cho tham số. Giá trị này được gọi là tham số hoặc đối số thực tế . Danh sách tham số tham chiếu đến loại, thứ tự và số tham số của hàm. Các tham số là tùy chọn; có nghĩa là, một hàm có thể không chứa tham số

Bài 5. Câu lệnh điều kiện trong C++ (if, switch)

  Để việc lập trình hiệu quả hơn hầu hết các Ngôn ngữ lập trình bậc cao đều có các câu lệnh rẽ nhánh và các câu lệnh lặp cho phép thực hiện các câu lệnh của chương trình không theo trình tự tuần tự như trong văn bản. Trong bài này, chúng ta sẽ tìm hiểu về những câu lệnh rẽ nhánh trong C++. Câu lệnh điều kiện if, if...else... Cú pháp: if (dieu_kien) {     khoi_lenh; } hoặc if (dieu_kien) {     khoi_lenh1; }  else {     khoi_lenh2; } hoặc if (dieu_kien) {     khoi_lenh1; }  else if (dieu_kien2) {     khoi_lenh2; } else {     khoi_lenh3; } Trong cú pháp trên if có 2 dạng: Có else. Không có else. dieu_kien là biểu thức logic có giá trị là true (khác 0) hoặc false (bằng 0). Khi chạy chương chình, dieu_kien sẽ được tính, nếu đúng, khoi_lenh1 sẽ được thực hiện . Ngược lại sẽ tiếp tục xét dieu_kien2 , nếu đúng sẽ thực hiện khoi_lenh2 . Ngược lại sẽ thực hiện khoi_lenh3. Ví dụ: # include < bits/stdc++.h > using namespace std ; int main () {     int a , b ;     cin >>