You are on page 1of 31

File vă n bả n

Nhu cầ u nhậ p/xuấ t dữ liệu lớ n


Khá i niệm file vă n bả n
Cá c thao tá c trên file vă n bả n
Xử lý dữ liệu lớ n
Khó nhậ p từ bà n phím
Khó kiểm chứ ng kết quả in ra mà n hình
Sử dụ ng cá c file dữ liệu
Nhậ p dữ liệu từ file
Xuấ t dữ liệu ra file
2
File vă n bả n
File vă n bả n
Dạ ng file có thể soạ n thả o đượ c (bằ ng Code::Blocks IDE, Notepad…), chứ a cá c ký
tự
Phâ n bố thà nh cá c dòng
Mộ t số (cặ p) ký tự đặ c biệt:
#13#10: Ký tự xuố ng dò ng
#26: Ký tự kết thú c file

Chỉ quan tâ m tớ i file vă n bả n. Cá c dạ ng file khá c phả i xử lý bằ ng cá ch khá c

3
Sắ p xếp (tên file bà i là m SORT.CPP)
Cho dãy số nguyên . Hãy sắ p xếp dãy đó theo thứ tự tă ng dầ n
 
Dữ liệu: Và o từ file vă n bả n SORT.INP
Dò ng 1 chứ a mộ t số nguyên
Dò ng 2 chứ a số nguyên cá ch nhau bở i dấ u cá ch ()
Kết quả : Ghi ra file vă n bả n SORT.OUT dãy đã sắ p xếp trên mộ t dò ng, hai phầ n tử liên tiếp
cá ch nhau bở i dấ u cá ch
Ví dụ
SORT.INP SORT.OUT
9 1 2 3 4 5 6 7 8 9
2 1 4 9 8 7 5 6 3

4
Cà i đặ t dù ng thiết bị nhậ p xuấ t chuẩ n
#include int main()
<iostream> {
#include cin >> n;
<algorithm> for (int i = 0; i < n; i++)
cin >> a[i];
using namespace
sort(a, a + n);
std; for (int i = 0; i < n; i++)
const int maxN cout << a[i] << ' ';
= 100000; }
int a[maxN], n;
5
Dù ng nhậ p/xuấ t file vă n bả n
Tạ o mộ t file vă n bả n, ghi và o đĩa vớ i tên
SORT.INP và nằ m cù ng thư mụ c vớ i file .cpp
Cô ng cụ : Code::Blocks, Notepad, …
Nộ i dung file SORT.INP là dữ liệu và o
Đầ u tiên gõ và o sample input (test ví dụ )
6
Định hướ ng lạ i thiết bị nhậ p chuẩ n
Khai bá o sử dụ ng thư viện cstdio
#include <cstdio>
Đầ u hà m main, cho và o dò ng lệnh
freopen("SORT.INP", "r", stdin)
Cô ng dụ ng: Định hướ ng lạ i thiết bị nhậ p chuẩ n thà nh file vă n bả n SORT.INP. Tấ t cả cá c lệnh
cin >> về sau sẽ lấy dữ liệu từ file SORT.INP thay vì yêu cầ u ngườ i dù ng gõ và o từ bà n phím.
Chạy chương trình (chú ý file SORT.INP phả i điền dữ liệu và ghi và o đĩa trướ c khi chạy
chương trình). Lợ i ích: Nếu chương trình chạy lỗ i, ta khô ng mấ t cô ng nhậ p lạ i dữ liệu suố t
quá trình sử a lỗ i và chạy thử .

7
Cà i đặ t dù ng file dữ liệu và o
#include int main()
<iostream> {
#include <cstdio> freopen("SORT.INP", "r", stdin);
#include cin >> n;
<algorithm> for (int i = 0; i < n; i++)
using namespace cin >> a[i];
std; sort(a, a + n);
const int maxN = for (int i = 0; i < n; i++)
100000; cout << a[i] << ' ';
int a[maxN], n; }

8
Định hướ ng lạ i thiết bị xuấ t chuẩ n
Khai bá o sử dụ ng thư viện cstdio
#include <cstdio>
Đầ u hà m main, cho và o dò ng lệnh
freopen("SORT.OUT", "w", stdout)
Cô ng dụ ng: Định hướ ng lạ i thiết bị xuấ t chuẩ n thà nh file vă n bả n SORT.OUT. Tấ t cả cá c
lệnh cout<< về sau sẽ in kết quả ra từ file SORT.INP thay vì in ra mà n hình.
Chạy chương trình (chú ý file SORT.OUT nếu đã có trên đĩa sẽ bị xó a và ghi đè lên bở i
kết quả chạy chương trình). Lợ i ích: Kết quả ra đượ c lưu lạ i để so sá nh, là m dữ liệu cho
chương trình khá c (xem cơ chế sinh test ở cá c slide sau).

9
Cà i đặ t dù ng file kết quả ra
#include int main()
<iostream> {
#include <cstdio> freopen("SORT.INP", "r", stdin);
freopen("SORT.OUT", "w", stdout);
#include
cin >> n;
<algorithm>
for (int i = 0; i < n; i++) cin >>
using namespace a[i];
std; sort(a, a + n);
const int maxN = for (int i = 0; i < n; i++)
100000; cout << a[i] << ' ';
int a[maxN], n; }

10
Mộ t số chú ý
Trong code::blocks, nên mở sẵ n mộ t cử a số
cho input file để tiện điền dữ liệu mớ i
File dữ liệu có thể soạ n thả o bằ ng tay, hoặ c
viết mộ t chương trình độ c lậ p sinh ra file dữ
liệu
11
Sinh input file
Soạ n thả o trự c tiếp input file chỉ có thể kiểm thử dữ liệu nhỏ , việc kiểm thử
 
vớ i dữ liệu lớ n cầ n có chương trình sinh input file
Ví dụ : Dù ng mộ t chương trình độ c lậ p (trình sinh test) tạ o ra file SORT.INP
vớ i và phầ n tử ngẫ u nhiên ghi theo đú ng khuô n dạ ng
Chạy chương trình SORT.CPP file dữ liệu SORT.INP đượ c trình sinh test tạ o
ra…
Trình sinh test cầ n viết độc lập, khô ng gây ả nh hưở ng tớ i chương trình
chính

12
Dù ng mà n hình
Khi đã định hướ ng thiết bị xuấ t chuẩ n và o file, sẽ khô ng có gì in ra mà n
hình
Nếu muố n in cá c kết quả trung gian ra để gỡ rố i, nhữ ng kết quả đó
cũ ng in và o file
Khó quan sá t
Dễ 0 điểm (khi nộ p bà i quên xó a nhữ ng dò ng in kết quả trung gian)
Giả i phá p: Cá c kết quả in để debug thì khô ng in ra cout mà in ra cerr.

13
Nhượ c điểm củ a freopen
Định hướ ng lạ i thiết bị nhậ p xuấ t chuẩ n (freopen) là phương phá p phổ biến nhấ t
trong cá c kỳ thi
Ưu điểm: Code nhanh, dễ dà ng thay đổ i cơ chế nhậ p xuấ t từ bà n phím + mà n
hình sang file vă n bả n và ngượ c lạ i
Nhượ c điểm:
Mấ t khả nă ng input từ bà n phím
Khô ng chuẩ n trong phá t triển mộ t modul phầ n mềm vớ i thiết bị nhậ p xuấ t chuẩ n dù ng
chung vớ i modul khá c
Bấ t tiện khi muố n nhậ p từ nhiều files hoặ c in ra nhiều files

14
Dù ng đố i tượ ng fstream
#include <fstream>
Khai bá o sử dụ ng thư viện chứ a cá c lớ p và hà m truy cậ p file
Cá c kiểu file trong C++
ifstream: Kiểu file dù ng để đọ c
ofstream: Kiểu file dù ng để ghi
fstream: Kiểu file tổ ng quá t

15
ifstream / ofstream
Kiểu file ifstream / ofstream là mộ t lớ p (class), mỗ i biến thuộ c kiểu
ifstream là mộ t đố i tượ ng mà chương trình đọ c file thô ng qua đố i tượ ng đó

Khai bá o và mở file Khai bá o và mở file


ifstream fi("SORT.INP"); ifstream fi;
ofstream fo("SORT.OUT"); ofstream fo;
fi.open("SORT.INP");
fo.open("SORT.OUT");
16
ifstream / ofstream
Khai bá o và mở file Khai bá o và mở file
ifstream fi("SORT.INP"); ifstream fi;
ofstream fo("SORT.OUT"); ofstream fo;
fi.open("SORT.INP");
fo.open("SORT.OUT");
Chú ý khi mở file như trên
file SORT.INP phả i có sẵ n trướ c khi chạy chương trình, sẵ n sà ng để đọ c dữ liệu
file SORT.OUT nếu đang có trên đĩa sẽ bị ghi đè lên bở i file rỗ ng, sẵ n sà ng để ghi kết quả

17
#include <iostream> int main()
#include <algorithm> {
#include <fstream>
ifstream
using namespace std;
fi("SORT.INP");
const int maxN =
100000; ofstream
int a[maxN], n; fo("SORT.OUT");

}
18
Đọ c ghi dữ liệu bằ ng fstream
ifstream có toá n tử >> để ofstream có toá n tử << để
đọ c dữ liệu ra ghi dữ liệu và o
Dù ng giố ng như toá n tử Dù ng giố ng như toá n tử
>> củ a cin << củ a cout

19
#include <iostream> int main()
{
#include <algorithm>
ifstream fi("SORT.INP");
#include <fstream> ofstream fo("SORT.OUT");
using namespace std; fi >> n;
for (int i = 0; i < n; i++)
const int maxN =
fi >> a[i];
100000; sort(a, a + n);
int a[maxN], n; for (int i = 0; i < n; i++)
fo << a[i] << ' ';

}

20
Đó ng file
Cá c đố i tượ ng ifstream/ofstream có mộ t vù ng nhớ đệm (buffer) là m trung gian vớ i
file trên đĩa
Mụ c đích nhằ m tă ng tố c tố c độ đọ c/ghi
Mỗ i lầ n đọ c mộ t lượ ng lớ n dữ liệu từ đĩa và o vù ng đệm, khi chương trình dù ng << sẽ lấy dữ
liệu từ buffer, nếu hết buffer mớ i đọ c tiếp từ đĩa
Mỗ i lầ n chương trình dù ng >> sẽ đẩy dữ liệu ra buffer, nếu buffer đầy mớ i ghi ra đĩa
Nếu chương trình kết thú c và buffer vẫ n cò n dữ liệu, dữ liệu đó khô ng đượ c đẩy
nố t ra đĩa  0 điể m.
 Cần đóng file sau khi sử dụng

21
Đó ng file
Phương thứ c close() củ a đố i tượ ng ifstream/ofstream
Cô ng dụ ng:
ifstream: Là m rỗ ng buffer và đó ng file, muố n đọ c dữ liệu lạ i từ
đầ u, phả i mở lạ i file bằ ng lệnh fi.open("…")
ofstream: Đẩy toà n bộ vù ng nhớ đệm ra đĩa và đó ng file, muố n ghi
dữ liệu khá c đè lên file cũ , phả i mở lạ i file bằ ng lệnh fo.open("…")

22
#include <iostream> int main()
{
#include <algorithm>
ifstream fi("SORT.INP");
#include <fstream> ofstream fo("SORT.OUT");
using namespace std; fi >> n;
for (int i = 0; i < n; i++)
const int maxN =
fi >> a[i];
100000; sort(a, a + n);
int a[maxN], n; for (int i = 0; i < n; i++)
fo << a[i] << ' ';
fi.close(); fo.close();
}

23
Cá c phương thứ c khá c truy cậ p file
Lệnh open cò n có thể có thêm nhiều tham số
để xá c định kiểu file, phương thứ c đọ c ghi, …
Cho phép ghi tiếp và o mộ t file đã có , đọ c ghi
file nhị phâ n (khô ng phả i file vă n bả n), …
Tự đọ c thêm trên internet…
24
Tă ng tố c độ đọ c ghi dữ liệu
ios_base::sync_with_stdio(false)
Khô ng đồ ng bộ luồ ng nhậ p xuấ t củ a C++ vớ i luồ ng nhậ p xuấ t củ a C. Khi chỉ dù ng lệnh C++ để
đọ c/ghi, lệnh này tă ng tố c độ đọ c/ghi lên đá ng kể
cin.tie(NULL); fi.tie(NULL);
Trong trườ ng hợ p đọ c/ghi trên cù ng mộ t luồ ng, mỗ i khi có lệnh đọ c dữ liệu (>>), vù ng đệm
ghi sẽ đượ c đẩy ra đĩa ngay lậ p tứ c vì có thể dữ liệu cầ n đọ c đang nằ m trong vù ng đệm ghi
Khi chắ c chắ n luồ ng nhậ p và luồ ng xuấ t khá c nhau, tie(NULL) để trá nh tình trạ ng đẩy vù ng
đệm ghi ra đĩa ngay lậ p tứ c trướ c mỗ i lệnh đọ c dữ liệu (>>), tă ng tố c độ bằ ng cá ch giả m số
lượ t truy cậ p đĩa

25
Dù ng '\n' thay cho endl
'\n' và endl có cô ng dụ ng như nhau đố i vớ i cá c luồ ng xuấ t
Khá c biệt:
Nếu đưa '\n' ra luồ ng xuấ t, ký tự xuố ng dò ng đượ c đẩy ra vù ng đệm ghi
Nếu đưa endl ra luồ ng xuấ t, ký tự xuố ng dò ng đượ c đẩy ra vù ng đệm ghi
và toà n bộ vù ng đệm ghi đượ c đẩy ra đĩa luô n
Dù ng '\n' sẽ trá nh tình trạ ng ghi đĩa nhiều lầ n, tă ng tố c độ xuấ t dữ liệu

26
Hiểu về luồ ng nhậ p xuấ t củ a C++
input/output củ a C++ thự c hiện thô ng qua cá c luồ ng nhậ p và luồ ng xuấ t
Luồ ng nhậ p có thể là thiết bị nhậ p chuẩ n (cin), file (ifstream), hoặ c mộ t đố i tượ ng
khá c để lấy dữ liệu từ mạ ng, …
Luồ ng xuấ t có thể là thiết bị xuấ t chuẩ n (cout), file (ofstream), hoặ c mộ t đố i tượ ng
khá c để đẩy dữ liệu lên mạ ng, …
Chú ng đều có cá c phương thứ c open(), <<, >>, close(), tie(…),…
Ngoạ i trừ luồ ng nhậ p xuấ t chuẩ n có cơ chế tự mở khi chạy chương trình và tự đó ng
khi kết thú c chương trình, cá c luồ ng khá c khi dù ng phả i có lệnh open() và khi kết
thú c chương trình phả i đó ng lạ i bằ ng close().

27
Là m form chương trình
Trong kỳ thi có nhiều bà i toá n, việc gõ lạ i
nhữ ng đoạ n code giố ng nhau khá nhà m chá n
và tố n thờ i gian
Tạ o mộ t file mẫ u (template) và copy code và o
mỗ i chương trình mớ i
28
#include <iostream> //form chương trình cho nhập xuất file
#include <fstream>
using namespace std;
#define task "???" //sửa theo mỗi bài, chẳng hạn thay ??? bởi SORT
ifstream fi(task".INP");
ofstream fo(task".OUT");

int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL); fi.tie(NULL);
//Do something here
fi.close(); fo.close();
}

29
#include <iostream> //form chương trình cho nhập xuất chuẩn
using namespace std;
#define task "???" //sửa theo mỗi bài, chẳng hạn thay ??? bởi
SORT
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
//Hai dòng sau dùng trong quá trình code và debug,
//khi nộp bài nhớ đóng chú thích lại hoặc bỏ đi
freopen(task".INP", "r", stdin);
freopen(task".OUT", "w", stdout);
//Do something here
}

30
Q&A
Câu hỏi: Tạ i sao phả i viết trình sinh test? Việc đó là củ a giá m khả o kia mà .
Trả lời 1:
Rấ t nhiều điều khó lườ ng khi chạy vớ i dữ liệ u lớ n (chạy quá thờ i gian, sinh lỗ i trà n, sai trườ ng hợ p đặ c
biệ t…). Khô ng phả i lú c nà o cũ ng cầ n trình sinh test nhưng khi khô ng chắ c chắ n về giả i phá p cầ n có nhữ ng
test lớ n để kiể m tra khả nă ng “chịu đự ng” củ a chương trình. Dĩ nhiên vớ i dữ liệ u lớ n và ngẫ u nhiê n, khó có
thể kiể m tra kết quả đú ng hay sai.
Trả lời 2: OK, test là củ a giá m khả o, điểm là củ a thí sinh .
Giá m khả o cầ n là m test sao cho có cà ng nhiề u bà i là m chạy hỏ ng cà ng tố t, nhữ ng chương trình qua đượ c sẽ
có chấ t lượ ng cao, chịu đự ng đượ c sự khắ c nghiệ t trong ứ ng dụ ng thự c tế .
Thí sinh cầ n là m chương trình sao cho khô ng có test hỏ ng. Muố n vậy phả i nghiêm khắ c và khá ch quan vớ i
chính sả n phẩ m củ a mình ở vị trí giá m khả o số #1, bao gồ m cả việc là m test.

31

You might also like