SLIDE1

Tuesday, June 2, 2015

thao tác file với thư viện fstream

Để sử dụng được thư viện fstream, ta phải include thư viện fstream và using namespace std;

#include <fstream>
using namespace std;
Điều đầu tiên, ta tạo ra một đối tượng fstream. Ta sẽ thao tác với file thông qua đối tượng đó.

fstream f;
Để mở một file, ta dùng phương thức open sau:

f.open(filePath, mod);
Trong đó:

filePath có kiểu dữ liệu là const char*, là đường dẫn đến file cần mở.
mod là chế độ mở file. Chúng ta có một số chế độ như sau:
ios::in Mở file để đọc.
ios::out Mở file có sẵn để ghi
ios::binary Mở file ở chế độ nhị phân.
ios:ate Mở file và đặt con trỏ file vào cuối file.
ios::app Mở file và ghi dữ liệu vào cuối file. Nếu file không tồn tại thì tạo file mới.
ios::trunc Chế độ mở file, xóa bỏ hoàn toàn nội dung trong file được mở.



Đọc và ghi dữ liệu với định dạng file nhị phân
Khi mở file mà không ghi rõ chế độ mở file, trình biên dịch sẽ chuyển về chế độ mở file text. Vì vậy, khi muốn mở ở chế độ binary, ta cần phải ghi rõ ràng mod là ios::binary. Việc mở file dưới chế độ binary có nghĩa là chúng ta sẽ đọc thông tin theo dạng binary file. Chúng ta sẽ sử dụng hàm write và read để đọc và ghi file dưới dạng binary.

f.read(address, size);
f.write(address, size);
adress: Kiểu dữ liệu char*, là địa chỉ vùng nhớ của dữ liệu được lưu vào file.
size: Kiểu dữ liệu int, là số byte vùng nhớ

#include <fstream>
 
using namespace std;
 
int main()
{
    char data[100];
 
    fstream f;
    f.open("text.txt", ios::in | ios::binary);
    if (!f)
    return 1;
 
    f.read(data, sizeof(data));
    f.close();
 
    return 0;
}
Đọc và ghi dữ liệu với định dạng file text
Sau khi mở tệp tin ta sẽ tiến hành đọc và ghi file bằng operator >> và <<.

Đọc file
f >> data;
f:  Kiểu dữ liệu fstream, là tên biến file.
data: là tên biến lưu trữ dữ liệu.

Ghi file
f << data;
f: là tên biến file.
data: tên biến dữ liệu chứa data cần ghi vào file.

Đóng file

Sau khi thao tác với file, ta sẽ tiến hành đóng file bằng lệnh:

f.close()

IV.Cách truyền 1 file name vào hàm :
Chúng ta khi làm việc với những chương trình thực sự thì đôi khi chúng ta cần phải truyền 1 tên file vào hàm nào đó để tiện cho việc quản lý, nhưng khi truyền phải lưu ý là luôn luôn truyền bằng tham chiếu..

.Dùng hàm thành viên để đọc và ghi file :
Khoảng trắng (Whitespace) là 1 kí tự mà nó là 1 phần của dữ liệu, vấn đề sẽ nảy sinh khi ta đoc vào bằng toán tử >>. Bởi vì toán tử >> nó xem khoảng trắng như 1 kí tự kết thúc (delimiter), vì thế nó sẽ không đọc chúng vào. Chúng ta sẽ dùng hàm getline() để xử lý những trường hợp như vậy.

Hoặc nếu không thích dùng kí tự mặc định '\n' của hàm getline() thì ta có thể dùng 1 kí tự bất kì khác như sau ví dụ :// Bây h dùng kí tự $ là kí tự kết thúc. 
dataFile.getline(input, SIZE, '$'); 

I.Hàm get() :
Hàm get()là 1 hàm rất hữu dụng trong việc thao tác với file. Ví dụ :

inFile.get(ch); 

Trong ví dụ trên thì ch là 1 biến kiểu char. Một kí tự sẽ được đọc vào từ file và lưu vào ch. Chương trình sau sẽ là 1 demo cho cách dùng get.

Chương trình trên sẽ xuất ra nội dung của bất kì file như thế nào. Hàm get() sẽ đọc luôn những kí tự trắng vì thế nội dung file sẽ y chang như nó xuất hiện trong file.

II.Hàm put()
Hàm get sẽ ghi 1 kí tự vào file. Ví dụ :

outFile.put(ch); 


Trong ví dụ trên thì biến ch là kiểu char. 

III. Các hàm định vị cho file tuần tự
• con trỏ vị trí ghi số thứ tự của byte tiếp theo để đọc/ghi
• các hàm đặt lại vị trí của con trỏ:
seekg (đặt vị trí đọc cho lớp istream)
– seekp (đặt vị trí ghi cho ostream)
– seekg và seekp lấycác đối số là offset và mốc (offset: số byte tương đối kể từ mốc)
•Mốc(ios::beg mặc định)
– ios::beg - đầu file
– ios::cur -vị trí hiện tại
– ios::end -cuối file
• các hàm lấy vị trí hiện tại của con trỏ:
– tellg và tellp
•Ví dụ
PHP Code:
fileObject.seekg(0)
đến đầu file (vị trí 0), mặc định đối số thứ hai là ios::beg

fileObject.seekg(n)
đến byte thứ n kể từ đầu file

fileObject.seekg(n, ios::cur)
tiến n byte

fileObject.seekg(y, ios::end)
lùi y byte kể từ cuối file

fileObject.seekg(0, ios::cur)
đến cuối file
seekp tương tự

location = fileObject.tellg()
lấy vị trí đọc hiện tại của fileObject