• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Kỹ thuật ghi và đọc file nhị phân

Các thủ thuật về hệ thống, thư mục, tập tin và mạng
Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Kỹ thuật ghi và đọc file nhị phân

Gửi bàigửi bởi truongphu » T.Năm 15/05/2008 10:32 am

Thủ thuật: Kỹ thuật ghi và đọc file nhị phân
Tác giả: truongphu
Mô tả: Thông thường chúng ta quen duyệt file theo dạng String. Bài viết trình bày Kỹ thuật ghi và đọc file nhị phân


Muốn ghi và đọc file nhị phân bạn phải mở file theo dạng: Open FileName For Binary As Filenum.
Dạng For Binary không quan tâm đến dòng, chỉ biết đến vị trí của byte đang xét.

Đọc và Ghi file: Dùng Function Get và Put như hướng dẫn ở VBLib.

Giá trị ghi có thể là số (vd: Long), chuỗi (string) hay một kiểu biến mà bạn định nghĩa.
Ghi với hàm Put phải kèm vị trí ghi. Ghi ở đầu file, vị trí ghi đương nhiên là 1.

Ghi giá trị ở vị trí nào thì phải đọc đúng vị trí ấy
Ghi giá trị theo định dạng nào thì phải đọc đúng định dạng ấy

Hệ quả: Khi ghi vào file theo dạng For Binary, với định dạng giá trị khác String, mở file thông thường, vd bằng Notepad, sẽ thấy toàn ô vuông! (nghĩa là Notepad đọc theo định dạng String nên không hiểu gì cả)

Sau đây là Code minh họa nội dung trên, cũng là minh họa bài trả lời bạn tasamsung với bài "Đọc file Binary?"
http://www.caulacbovb.com/forum/viewtopic.php?f=7&t=1016

Mã: Chọn hết

  1. Private Type HocSinh
  2. HoTên As String
  3. Tuôi As Byte
  4. GioiTính As String
  5. Cânnang As Integer
  6. ChiêuCao As Long
  7. HocLuc As String
  8. End Type
  9. Private Sub Form_Load()
  10. Dim a As HocSinh
  11. a.Cânnang = 52
  12. a.ChiêuCao = 167
  13. a.GioiTính = "Nu"
  14. a.HocLuc = "Gioi"
  15. a.HoTên = "Hà Kiêu Em"
  16. a.Tuôi = 21
  17. Open "C:\1.txt" For Binary As #1
  18. Put #1, 1, a
  19. Close #1
  20. End Sub
  21. Private Sub Command1_Click()
  22. Open "C:\1.txt" For Binary As #1
  23. Dim b As HocSinh
  24. Get #1, 1, b
  25. MsgBox b.Cânnang & vbCrLf & b.ChiêuCao & vbCrLf & b.GioiTính & vbCrLf & b.HocLuc & vbCrLf & b.HoTên
  26. 'Chi có thê dùng lênh trong Command1 mo'i Ðoc hêt nôi dung cua C:\1.txt
  27. End Sub


o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
playgemboy
Thành viên danh dự
Thành viên danh dự
Bài viết: 289
Ngày tham gia: CN 13/04/2008 6:10 am
Đến từ: Bình Phú, Quận 6, TP.HCM
Been thanked: 1 time
Liên hệ:

Re: Kỹ thuật ghi và đọc file nhị phân

Gửi bàigửi bởi playgemboy » T.Năm 05/06/2008 9:34 am

Thủ thuật này hay quá, nhưng theo như cách này chỉ ghi được một record,vd nếu em muốn ghi thêm một Hoc sinh khác thì làm thế nào? em thử Put #1, 2, a nhưng lúc đọc vào, chỉ đọc được cái thứ 2,còn cái thứ nhất thì bị lỗi,(hình như bị cái thứ 2 đè lên hay sao í)
<I Come Back>

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Re: Kỹ thuật ghi và đọc file nhị phân

Gửi bàigửi bởi truongphu » T.Năm 05/06/2008 2:11 pm

Mã: Chọn hết

  1. Private Type HocSinh
  2. HoTên As String
  3. Tuôi As Byte
  4. GioiTính As String
  5. Cânnang As Integer
  6. ChiêuCao As Long
  7. HocLuc As String
  8. End Type
  9. Private Sub Form_Load()
  10. Dim a(1) As HocSinh
  11. a(0).Cânnang = 52
  12. a(0).ChiêuCao = 167
  13. a(0).GioiTính = "Nu"
  14. a(0).HocLuc = "Gioi"
  15. a(0).HoTên = "Hà Kiêu Em"
  16. a(0).Tuôi = 21
  17.  
  18. a(1).Cânnang = 48
  19. a(1).ChiêuCao = 172
  20. a(1).GioiTính = "Nam"
  21. a(1).HocLuc = "Kha"
  22. a(1).HoTên = "Lê My Anh"
  23. a(1).Tuôi = 18
  24. Open "C:\1.txt" For Binary As #1
  25. For i = 0 To 1
  26. Put #1, , a(i)
  27. Next
  28. Close #1
  29. End Sub
  30. Private Sub Command1_Click()
  31. Open "C:\1.txt" For Binary As #1
  32. Dim b(1) As HocSinh
  33. For i = 0 To 1
  34. Get #1, , b(i)
  35. Next
  36. MsgBox b(1).Cânnang & vbCrLf & b(1).ChiêuCao & vbCrLf & b(1).GioiTính & vbCrLf & b(1).HocLuc & vbCrLf & b(1).HoTên
  37. 'Chi có thê dùng lênh trong Command1 mo'i Ðoc hêt nôi dung cua C:\1.txt
  38. End Sub

Có thể gọi kỹ thuật ghi file nầy là kỹ thuật truongphu được chăng? :D ;)
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
playgemboy
Thành viên danh dự
Thành viên danh dự
Bài viết: 289
Ngày tham gia: CN 13/04/2008 6:10 am
Đến từ: Bình Phú, Quận 6, TP.HCM
Been thanked: 1 time
Liên hệ:

Re: Kỹ thuật ghi và đọc file nhị phân

Gửi bàigửi bởi playgemboy » T.Bảy 07/06/2008 3:37 pm

Không chê vào đâu được, cách này dùng thay mấy cái file .mdb được đấy, từ nay khỏi dính tới mấy cái conection rắc rối, dữ liệu cũng được an toàn hơn xài cái Text.Cảm ơn bác truongphu rất nhiều. Chắc là không ai phản đối việc đặt tên kĩ thuật theo nick của bác đâu, ví dụ như BinaryTruongPhu chẳng hạn :) .
<I Come Back>

Hình đại diện của người dùng
Kasper
Guru
Guru
Bài viết: 1062
Ngày tham gia: T.Sáu 16/05/2008 10:54 am
Has thanked: 2 time
Been thanked: 76 time
Liên hệ:

Re: Kỹ thuật ghi và đọc file nhị phân

Gửi bàigửi bởi Kasper » T.Sáu 27/06/2008 9:30 am

playgemboy đã viết:Không chê vào đâu được, cách này dùng thay mấy cái file .mdb được đấy, từ nay khỏi dính tới mấy cái conection rắc rối, dữ liệu cũng được an toàn hơn xài cái Text.Cảm ơn bác truongphu rất nhiều. Chắc là không ai phản đối việc đặt tên kĩ thuật theo nick của bác đâu, ví dụ như BinaryTruongPhu chẳng hạn :) .


Cái này mà đòi thay mấy cái .mdb, thử đi rồi biết nó khó khăn như thế nào. Muốn tìm kiếm, thay thế, xóa một bản ghi không đơn giản đâu nhé. Cái lưu file nhị phân này tui chỉ làm để lưu thông số game hoặc high score thôi
Lành tợ tòng, ác tợ hoa,
Nhà hòa muôn việc đều nên.

Hình đại diện của người dùng
playgemboy
Thành viên danh dự
Thành viên danh dự
Bài viết: 289
Ngày tham gia: CN 13/04/2008 6:10 am
Đến từ: Bình Phú, Quận 6, TP.HCM
Been thanked: 1 time
Liên hệ:

Re: Kỹ thuật ghi và đọc file nhị phân

Gửi bàigửi bởi playgemboy » CN 29/06/2008 7:12 am

Yêu cầu với CSDL của em ko nhiều,kích thước cũng không lớn cho nên khắc phục những yêu cầu của bác:
Muốn tìm kiếm, thay thế, xóa một bản ghi không đơn giản đâu nhé.

Khi thao tác với dữ liệu thì em đã load hết vào trong ListView (report), do đó khi cập nhật,thêm mới, thay thế, xóa.... đều thực hiện trên list, không tác động chi tới file. chỉ khi nào ấn Save thì nó ghi lại file với dữ liệu mới từ list.Ở đây em không phủ nhận những lợi ích của việc sử dụng kết nối CSDL đâu nhé, nhưng tại em ko rành nên đành tự thiết kế cho mình cách đọc và ghi CSDL dựa trên BinaryTruongPhu. ;;)
Cái lưu file nhị phân này tui chỉ làm để lưu thông số game hoặc high score thôi

Nếu chỉ dùng như vậy thì hơi bị "phí" đấy quá :)
<I Come Back>

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Re: Kỹ thuật ghi và đọc file nhị phân

Gửi bàigửi bởi truongphu » CN 29/06/2008 2:34 pm

Có 2 người tranh luận thì tác giả phải lên tiếng:
Ở trên tôi trình bày 2 kỹ thuật ghi và đọc các mảng trong file nhị phân.
--> Yêu cầu Tìm kiếm mảng, Sửa và Xóa trên File khá đơn giản trên nguyên tắc đọc hết file với vòng lặp For. . Next, Tiến hành sửa hay xóa một mảng, xong ghi lại file

Trong cấu trúc đọc file ở trên:

Mã: Chọn hết

  1. Dim b(1) As HocSinh
  2. For i = 0 To 1
  3. Get #1, , b(i)
  4. Next


Nếu muốn xóa (hoặc sửa): ví dụ b(1)

Mã: Chọn hết

  1. if i = 1 then
  2. b(1).Cânnang = 0
  3. b(1).ChiêuCao = 0
  4. b(1).GioiTính = ""
  5. b(1).HocLuc = ""
  6. b(1).HoTên = ""
  7. b(1).Tuôi = 0
  8. end if

chèn vào là xong:

Mã: Chọn hết

  1. Dim b(1) As HocSinh
  2. For i = 0 To 1
  3. Get #1, , b(i)
  4. if i = 1 then
  5. b(1).Cânnang = 0
  6. b(1).ChiêuCao = 0
  7. b(1).GioiTính = ""
  8. b(1).HocLuc = ""
  9. b(1).HoTên = ""
  10. b(1).Tuôi = 0
  11. end if
  12. Next

Sau khi có tập hợp mảng b(i) đã edit, ta ghi lại file.
Chúc playgemboy có nhiều ứng dụng hay. Nếu các chuỗi String được mã hóa thì tính bảo mật của file rất cao
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

ledothien

Re: Kỹ thuật ghi và đọc file nhị phân

Gửi bàigửi bởi ledothien » T.Năm 24/12/2009 4:08 pm

đọc được topic của anh viết thật là đúng lúc, do em đang viết 1 pm nhỏ, để quản lý hồ sơ của công ty
vấn đề là cũng giống như anh đặt ra
a as hoso
nhưng do ban đầu chưa biết số luong hồ sơ bao nhiêu
và mỗi lần chạy file là người dùng sẽ thêm vào 1 a(i) cho file dữ liệu

Mã: Chọn hết

Private Type DuAn
  TenCongTrinh As String
  TongDuAn As String
  ThietKe As String
  ThamTraDauTu As String
  ThamTraThietKe As String
  GiamSat As String
  NgayStar As String
  NgayEnd As String
  NhanLuc As String
  GhiChu As String
End Type
    Dim a(100) As DuAn
    Dim i As Integer
Private Sub cmdSave_Click(Index As Integer)
    i = 0
    Open "F:\thinhlong\quan ly du an\dulieu.txt" For Binary As #1
    Do While Not EOF(dulieu)
        i = i + 1
    Loop
    a(i + 1).TenCongTrinh = lblTenCongTrinh.Caption
    a(i + 1).TongDuAn = frmNhapDuLieu.txtTongDuToan
    a(i + 1).ThietKe = frmNhapDuLieu.txtThietKe
    a(i + 1).ThamTraDauTu = frmNhapDuLieu.txtThamTraDauTu
    a(i + 1).ThamTraThietKe = frmNhapDuLieu.txtThamTraThietKe
    a(i + 1).GiamSat = frmNhapDuLieu.txtGiamSat
    a(i + 1).NgayStar = frmNhapDuLieu.txtNgayStar
    a(i + 1).NgayEnd = frmNhapDuLieu.txtNgayEnd
    a(i + 1).NhanLuc = frmNhapDuLieu.txtNhanLuc
    a(i + 1).GhiChu = frmNhapDuLieu.txtGhiChu
    Put #1, dulieu, a(i + 1)
    Close #1
End Sub

nhưng không biết sao nó báo lỗi ở hoài..
và nếu được thì anh chỉ em cách :
xuất ra hết các dữ liệu ra dạng bảng như trong excel
cảm ơn anh nhiều ah

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Re: Kỹ thuật ghi và đọc file nhị phân

Gửi bàigửi bởi truongphu » T.Năm 24/12/2009 5:48 pm

ledothien đã viết:đọc được topic của anh viết thật là đúng lúc

hè hè, bài viết đã lâu, vẫn còn ứng dụng!

1-
ledothien đã viết:TenCongTrinh As String

String bạn định nghĩa như trên, vb6 sẽ dành 1024 byte
tôt nhất bạn nên giới hạn string khi định nghĩa: vd

Mã: Chọn hết

TenCongTrinh As String * 50


2-
ledothien đã viết: Open "F:\thinhlong\quan ly du an\dulieu.txt" For Binary As #1
Do While Not EOF(dulieu)

For Binary là kỹ thuật mở nhị phân file txt
còn Do While Not EOF(dulieu) là kỹ thuật đọc dòng trong For OutPut
do đó cho nên:
nhưng không biết sao nó báo lỗi ở hoài..


3-
ledothien đã viết:nhưng do ban đầu chưa biết số luong hồ sơ bao nhiêu
và mỗi lần chạy file là người dùng sẽ thêm vào 1 a(i) cho file dữ liệu

Có lẽ:
a- Khai biến Mảng lớn như bạn đã cho: 100
b- Hoặc khai biến Mảng động, thêm vào thì Redim.
bạn tham khảo thử : Hỏi về cấu trúc mảng để lưu dữ liệu
viewtopic.php?f=7&t=10427&start=0

4- xuất ra hết các dữ liệu ra dạng bảng như trong excel
a- Thao tác với Excel, bạn tìm đọc bài tôi viết trong mục Hướng dẫn
b- Hình như các cell: hàng ngang (khác cột) cách VBTAB
hàng dọc (khác hàng) cách nhau VBCRLF
Vậy thì bạn bố trí sắp xếp thế nào để đọc các biến trong mảng thành một chuỗi, Xong dán vào 1 cell, có thể sẽ tự động phân bố...
Giờ tôi hơi bận, sẽ trở lại đề tài nầy...
Chúc bạn sớm tìm giải pháp
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Re: Kỹ thuật ghi và đọc file nhị phân

Gửi bàigửi bởi truongphu » T.Sáu 25/12/2009 8:48 am

  1. Private Type DuÁn '376 byte
  2.  TenCongTrinh As String * 50
  3.   TongDuAn As Double  '8 byte
  4.  ThietKe As String * 25
  5.   ThamTraDauTu As String * 25
  6.   ThamTraThietKe As String * 25
  7.   GiamSat As String * 25
  8.   NgayStart As Date ' 8 byte
  9.  NgayEnd As Date ' 8 byte
  10.  NhanLuc As Integer ' 2 byte
  11.  GhiChu As String * 200
  12. End Type
  13.  
  14. Dim MoFile(100) As DuÁn, SôDL As Integer
  15.  
  16. Private Sub Command1_Click() 'NhâpLiêu
  17. If txtTenCongTrinh.Text = "" Then
  18.     MsgBox "Chua có tên công trình"
  19.     Exit Sub
  20. End If
  21.  
  22. If txtNgayStart <> "" And IsDate(txtNgayStart) = False Then
  23.     MsgBox "Ngày Kho'i Ðâ`u sai"
  24.     Exit Sub
  25. End If
  26.  
  27. If txtNgayEnd <> "" And IsDate(txtNgayEnd) = False Then
  28.     MsgBox "Ngày Kê't thúc sai"
  29.     Exit Sub
  30. End If
  31.  
  32. Open App.Path & "\thinhlong\quan ly du an\dulieu.txt" For Binary As #1
  33.     Dim NhâpLiêu() As DuÁn
  34.     ReDim NhâpLiêu(SôDL)
  35.     NhâpLiêu(SôDL).TenCongTrinh = txtTenCongTrinh
  36.     NhâpLiêu(SôDL).TongDuAn = txtTongDuToan
  37.     NhâpLiêu(SôDL).ThietKe = txtThietKe
  38.     NhâpLiêu(SôDL).ThamTraDauTu = txtThamTraDauTu
  39.     NhâpLiêu(SôDL).ThamTraThietKe = txtThamTraThietKe
  40.     NhâpLiêu(SôDL).GiamSat = txtGiamSat
  41.     NhâpLiêu(SôDL).NgayStart = txtNgayStart
  42.     NhâpLiêu(SôDL).NgayEnd = txtNgayEnd
  43.     NhâpLiêu(SôDL).NhanLuc = txtNhanLuc
  44.     NhâpLiêu(SôDL).GhiChu = txtGhiChu
  45.    
  46.     Dim xx As Long: xx = (SôDL * 376) + 1
  47.     Put #1, xx, NhâpLiêu(SôDL)
  48. Close #1
  49.  
  50. End Sub
  51.  
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

ledothien

Re: Kỹ thuật ghi và đọc file nhị phân

Gửi bàigửi bởi ledothien » T.Sáu 25/12/2009 3:40 pm

em lam như anh huong dẫn, mà em không biết còn lỗi gì ở dòng sau...

=>>>> Open App.Path & "D:\thinhlong\quan ly du an\dulieu.txt" For Binary As #1

thậm chí em copy cả code của anh, nó vẫn báo lỗi ở dòng này..error 52-->bad file name or number
(file dulieu.txt là chính xac duong dẫn rồi, đúng tên lun.)
mong được anh chỉ giúp, cảm ơn anh ah

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Re: Kỹ thuật ghi và đọc file nhị phân

Gửi bàigửi bởi truongphu » T.Sáu 25/12/2009 4:57 pm

học lập trình phải tỉ mỉ, cẩn thận;
ledothien đã viết:thậm chí em copy cả code của anh, nó vẫn báo lỗi ở dòng này..error 52-->bad file name or number

ledothien đã viết:=>>>> Open App.Path & "D:\thinhlong\quan ly du an\dulieu.txt" For Binary As #1


* Bạn xem đó có phải là copy code của tôi không?
* Bạn nên tìm trong Forum từ: App.Path mà các bạn khác hay gọi là đường dẫn tương đối
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
float01
Thành viên năng nổ
Thành viên năng nổ
Bài viết: 97
Ngày tham gia: T.Ba 31/08/2010 2:46 pm
Has thanked: 20 time
Been thanked: 9 time

Re: Kỹ thuật ghi và đọc file nhị phân

Gửi bàigửi bởi float01 » T.Tư 31/08/2011 8:14 pm

cho e hỏi là có dùng được cách này để mở file có tên tiếng việt để ghi vào ko ?
Nếu có thì làm bằng cách nào mong mọi người hướng dẫn.

Hong Hai
Bài viết: 8
Ngày tham gia: CN 08/06/2014 11:14 am

Re: Kỹ thuật ghi và đọc file nhị phân

Gửi bàigửi bởi Hong Hai » T.Bảy 01/08/2015 10:53 am

Bạn "truongphu" ơi cho mình hỏi nếu muốn ghi dữ liệu là unicode thì phải làm sao. VD: Phần tên mình muốn ghi tiếng Việt. Xin cám ơn

Hong Hai
Bài viết: 8
Ngày tham gia: CN 08/06/2014 11:14 am

Re: Kỹ thuật ghi và đọc file nhị phân

Gửi bàigửi bởi Hong Hai » T.Bảy 15/08/2015 2:30 pm

Mình tìm ra cách nầy không biết có được không: Khi lưu thì chuyển sang ASCII, khi trình chiếu thì chuyển lại Unicode.


Quay về “[VB] Hệ thống - Tập tin - Thư mục và Mạng”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.2 khách