Xin chào, và chào mừng trở lại.
Trong bài giảng này, tôi muốn nói về định vị tệp, về cơ bản một
số chức năng sẽ cho phép bạn để thay đổi vị trí của tệp.
Vì vậy, đối với nhiều ứng dụng, bạn sẽ để có thể truy cập dữ liệu trong
một tệp khác với thứ tự tuần tự.
Thứ tự tuần tự đang bắt đầu ở đầu và
sau đó đi từng byte về cuối.
Điều đó không phải lúc nào cũng hữu ích bởi vì bạn có thể
muốn thực sự vào giữa tệp và lấy dữ liệu hoặc tại cuối tệp và lấy dữ liệu.
Tất cả phụ thuộc vào ứng dụng.
Bạn không phải lúc nào cũng muốn đi Từ khi bắt đầu đến lúc kết thúc.
Vì vậy, có nhiều chức năng khác nhau mà bạn có thể sử dụng để truy
cập dữ liệu theo trình tự ngẫu nhiên.
Có hai khía cạnh định vị tệp.
Một là tìm ra nơi bạn nằm trong một tệp và tệp kia đang di chuyển
đến một điểm nhất định trong tệp.
Đó thực sự là hai điều bạn muốn tìm hiểu khi bạn
đang nói về các tệp và vị trí của tệp, những gì nó thực sự trỏ đến.
Một lần nữa, bạn đang ở đâu trong tệp chính nó và bạn có muốn di chuyển đến
một nơi khác trong tệp hay không.
Vì vậy, bạn có thể truy cập tệp tại một vị trí ngẫu nhiên bất kể bạn có mở
tệp hay không, bạn có thể di chuyển đối tác tệp của mình.
Bạn không cần phải mở để thay đổi nơi bạn đang ở để thay
đổi xem bạn đang ở đâu.
Vì vậy, tìm hiểu xem bạn đang ở đâu chúng ta sẽ nói về đầu tiên.
Bạn có hai chức năng để tìm ra nơi bạn đang ở trong một tập tin.
Được gọi là ftel và một là được gọi là fgetpos, vị trí fget.
Đối với ftell, chức năng thực tế định nghĩa khá đơn giản.
Bạn quay trở lại và bạn lấy một con trỏ tệp.
Và chức năng này sẽ chấp nhận một con trỏ tệp làm đối
số và nó sẽ trả về số nguyên dài giá trị chỉ định vị trí ký tự
trong tệp, vì vậy nó sẽ cho bạn biết vị trí.
Bạn có thể sử dụng nó bằng cách tạo trong trường hợp này là fpos, sẽ chuyển đến những
gì sẽ nhận được trả về và sau đó chuyển
con trỏ tệp đó và gọi ftel.
Biến vị trí f hiện được giữ vị trí hiện tại trong tệp và bạn có
thể sử dụng nó để quay lại vị trí vào bất kỳ thời điểm nào tiếp theo.
Vì vậy, nó sẽ trả lại cho bạn fposition.
Đây là cách bạn có thể nhận được vị trí của điểm hiện tại
mà bạn đang trỏ đến.
Giá trị là độ lệch tính bằng byte từ đầu tệp.
Vì vậy, cảm thấy rất đơn giản với sử dụng thẻ trong con trỏ của bạn,
nó sẽ trả về và cho bạn biết bạn đang ở đâu có trong tệp của bạn dựa trên
cơ bản từ đầu tệp cho đến khi bao nhiêu byte từ đầu.
Vì vậy, trong ví dụ này, chúng tôi đang tạo một con trỏ tệp được gọi là fp và chúng tôi đang tạo
một số nguyên được gọi là độ dài.
Chúng tôi sẽ mở tệp, và điều này sẽ chỉ để đọc.
Chúng tôi sẽ làm chắc chắn rằng nó không rỗng.
Nếu đúng như vậy, chúng tôi sẽ để trả về một lỗi.
Và sau đó đừng lo lắng về fseek.
Fseek thực sự chỉ diễn ra để đi đến cuối tệp.
Đây là một chức năng khác giúp chúng tôi.
Tôi chỉ sử dụng nó để chứng minh ftel.
Fseek sẽ đi đến cuối cùng của tệp, và sau
đó bạn sẽ nói ftell fp, và điều đó sẽ để cho bạn biết về cơ bản bạn
sẽ ở cuối tệp.
Vì vậy, liên kết được trả về ở cuối tệp.
Và những gì sắp xảy ra là nó sẽ trả về tổng
kích thước của tệp dựa trên độ dài bởi vì bạn thực sự đã di chuyển con trỏ của mình đến cuối
và sau đó bạn cho biết tôi đang ở đâu và nó nói rằng bạn đang ở cuối,
vì vậy hãy trở lại cuối cùng.
Và cuối cùng là số byte từ khi bạn đọc lần cuối.
Vì vậy, chúng ta hãy xem xét điều này bên trong của IDE tốt đẹp của chúng tôi các khối mã của chúng tôi.
Vì vậy, đây là ví dụ mã hóa của chúng tôi nơi chúng tôi tạo con trỏ tệp của mình.
Chúng tôi đặt nó thành null, làm cho chắc chắn rằng nó không rỗng.
Chúng tôi cố gắng mở nó ra.
Và sau đó chúng tôi thực hiện một fseek chỉ là sẽ thay đổi con trỏ tệp của chúng tôi.
Ftel sẽ nói với chúng tôi nơi chúng tôi đang chỉ đến.
Vì vậy, nó sẽ chỉ đến kết thúc và nó sẽ là bất
kỳ số byte nào ở cuối.
Khi chúng tôi chạy cái này, bạn sẽ làm gì để ý là nó hiển thị 24 byte.
Vì vậy, điều đó có nghĩa là bạn đang ở cuối vì tệp là tệp nhỏ
và tệp chỉ chứa 24 byte.
Thông thường, bạn sẽ sử dụng ftel sau khi bạn đã viết hoặc đọc một số hoặc sau
khi bạn đã làm nó trong fseek nơi bạn đã chuyển đến một nơi nào đó.
Nhưng nó rất đơn giản để gọi ftel với con trỏ tệp và sau đó
len chỉ cho bạn biết bạn đang ở đâu.
Bạn cũng có thể sử dụng tiện ích vị trí hoặc chức năng fgetpos.
Và đây là một chức năng thứ hai cung cấp thông tin về vị
trí tệp hiện tại.
Nó nhiều hơn một chút phức tạp hơn ftel.
Điều này trả về một số nguyên.
Nó cần một con trỏ tệp và nó cũng lấy loại f vị trí t.
Vì vậy, tham số đầu tiên là con trỏ tệp đó, để bạn
biết bạn cần đọc tệp nào.
Tham số thứ hai là một con trỏ đến một loại được xác định trong standardio. h.
Loại t vị trí f có thể ghi lại mọi vị trí trong một tệp.
Vì vậy, chức năng vị trí fget là được thiết kế để
sử dụng khi chức năng định vị lệch vị trí.
Vì vậy, bạn sử dụng vị trí fset và sau đó bạn sử dụng vị trí fget
kết hợp với điều đó.
Vì vậy, chức năng vị trí fget lưu trữ vị trí hiện tại
và thông tin trạng thái tệp cho tệp và vị trí
và trả về 0 nếu hoạt động thành công, trả về giá trị số nguyên khác 0 cho lỗi.
Vì vậy, bạn có thể tạo một biến của loại vị trí s.
Và ở đây chúng tôi nói rằng nó chỉ ở đây.
Sau đó, chúng tôi gọi vị trí fget.
Chúng tôi chỉ định trong con trỏ tệp của mình và chúng tôi chỉ định trong loại vị trí f của chúng tôi.
Chúng ta phải vượt qua dấu và, địa chỉ của vì nó không phải là một con trỏ.
Vì vậy, trong trường hợp này, dòng điện vị trí tệp nằm trong
biến hello hoặc tại đây.
Vì vậy, bạn phải khai báo một biến của loại f vị trí t bởi vì đó
là những gì bạn vượt qua trong tham số, tham số thứ hai của bạn.
Bạn có thể khai báo một con trỏ của gõ f vị trí t sao vì sẽ không
có bất kỳ ký ức nào được liên kết để lưu trữ dữ liệu vị trí.
Vì vậy, hãy xem xét một ví dụ điều này sẽ có ý nghĩa hơn rất nhiều.
Trong trường hợp này, chúng tôi tạo tệp của mình con trỏ, chúng tôi tạo vị trí kiểu f
sở hữu t, chúng tôi gọi là mở và sau đó chúng tôi gọi là vị trí fget.
Và chúng tôi chuyển vào hồ sơ của mình con trỏ ở vị trí cuối của chúng tôi.
Vì vậy, đó là nơi chúng tôi lưu trữ vị trí.
Chúng tôi sẽ lấy vị trí mà chúng tôi đang ở.
Sau đó, khi chúng ta nói f đặt s, chúng tôi đang ghi một số dữ liệu đến bất cứ
nơi nào chúng tôi di chuyển đến.
Vì vậy, một lần nữa, f có được vị trí và ftell cho bạn biết bạn muốn thực sự viết
hoặc đọc từ đâu.
Nó ở đâu đó ở giữa.
Nó không phải ở đầu, nó không ở cuối.
Bạn đang di chuyển.
Bạn sẽ thường di chuyển bằng một cuộc tìm kiếm hoặc di chuyển của bạn với một cái gì đó
khác, có được vị trí và điều đó cho bạn biết bạn đang ở đâu.
Vì vậy, vị trí fget và ftell là sẽ cho bạn biết chính xác nơi bạn đang trỏ đến
và điều đó có nghĩa là bạn có thể di chuyển đến một nơi khác và
bạn sẽ có thể đọc.
Bây giờ thiết lập một vị trí trong một nộp hồ sơ cho đến thời điểm này, chúng tôi chỉ
đang đọc ở nơi chúng tôi đang ở.
Chúng tôi sẽ không thực sự đọc ở nơi chúng ta đang ở trừ khi chúng
ta thiết lập một cái gì đó, chúng ta đã đọc và viết.
Vì vậy, như một sự bổ sung cho ftell, bạn cũng có fseek.
Và fseek sẽ cho phép bạn di chuyển đến một nơi nào đó cho vị trí của bạn.
Nó trả về một int.
Nó trả về một con trỏ tệp, một fset và một số nguyên gốc.
Tham số đầu tiên là một con trỏ vào tệp bạn đang định vị lại.
Tham số thứ hai và thứ ba xác định nơi bạn muốn đến trong tệp.
Tham số thứ hai là một offset nơi một điểm tham chiếu
được chỉ định bởi tham số thứ ba.
Điểm tham chiếu có thể là một trong số ba giá trị mà bạn chỉ
định bởi các tên được xác định trước.
Tìm kiếm thiết lập, tìm kiếm hiện tại và tìm kiếm kết thúc.
Bộ tìm kiếm xác định đầu của tệp.
Tìm kiếm đường cong xác định dòng điện vị trí trong tệp và tìm kiếm kết
thúc xác định phần cuối của tệp.
Vì vậy, đối với tệp chế độ văn bản, đối số thứ hai phải là một giá trị
được trả về bởi ftel.
Vì vậy, bạn nên nhận thấy rằng với fseek và ftel, chúng được sử dụng cùng nhau.
Vì vậy, đối số thứ ba cho văn bản các tệp chế độ phải được đặt.
Đối với tệp văn bản, tất cả các thao tác với fseek được thực hiện với tham chiếu
đến phần đầu của tệp cho tệp nhị phân mà chúng tôi chưa thực sự
tìm hiểu nhiều về.
Nhưng đối với các tệp nhị phân, đối số offset chỉ đơn giản
là số byte tương đối.
Do đó, bạn có thể cung cấp các giá trị dương hoặc
âm cho độ lệch khi tham chiếu điểm được chỉ định là tìm kiếm.
Vì vậy, chúng ta hãy xem xét một ví dụ.
Trong ví dụ này, một lần nữa, chúng tôi thực hiện fputs.
Vì vậy, chúng tôi ghi một số dữ liệu vào và sau đó chúng tôi sử dụng fseek.
Fseek sẽ di chuyển bạn.
Đây đang nói rằng bạn sẽ di chuyển bảy byte và chúng tôi sử dụng bộ tìm kiếm
để nói rằng chúng tôi muốn để di chuyển đến một nơi nào đó về cơ bản
là bảy byte ngay từ đầu.
Và chúng ta có thể di chuyển từ đầu tệp bằng
bảy byte sẽ di chuyển tệp.
Sau bảy byte, chúng ta có thể thực sự ghi dữ liệu vào nó.
Và chúng tôi cũng có thể sử dụng ftell để thấy rằng oh sau bảy byte
chúng tôi đang ở đâu.
Bạn có thể sử dụng thông tin để lấy lại từ nơi bạn đang ở.
Một lần nữa, toàn bộ điểm của fseek và tiện ích là bạn đang nhìn thấy
vị trí của bạn để chỉ định nơi bạn muốn viết hoặc đọc.
Vì vậy, fseek s thực sự sẽ di chuyển vị trí, nói sẽ cho bạn
biết bạn đang ở đâu.
Vị trí Fset cũng giống như fseek.
Nhưng vị trí fset là một phức tạp hơn một chút.
Nó sẽ đi với vị trí fset.
Vì vậy, fset get get position cũng là rất giống với vị trí fset.
Với vị trí fset, nó chỉ định tham số đầu tiên làm con
trỏ đến tệp đang mở.
Tham số thứ hai là con trỏ của loại f vị trí t.
Vị trí được lưu trữ tại địa chỉ được
lấy bằng cách chứa vị trí fget.
Vì vậy, vị trí fset có tệp của bạn con trỏ và sau đó là biến thực tế của bạn.
Và biến ở đây trước đây là thiết lập bởi một cuộc gọi đến vị trí fget.
Một lần nữa, bạn sẽ sử dụng fset và fget với nhau.
Vị trí fset trả về một giá trị khác 0 khi bị lỗi hoặc bằng 0
khi nó thành công.
Chức năng này được thiết kế để làm việc với một giá trị
được trả về bởi vị trí fget.
Vì vậy, bạn chỉ có thể sử dụng nó để đến đánh số trong một tệp để có được một vị trí trong tệp
mà bạn đã có trước đó.
Fseek cho phép bạn đi đến bất kỳ vị trí chỉ bằng cách xác định
độ lệch thích hợp.
Vì vậy, ở đây chúng tôi giống như chúng tôi có vị trí t loại vị trí của chúng tôi.
Chúng tôi mở tệp của mình và thì chúng ta gọi là vị trí fget.
Ở vị trí fget, chúng tôi đang chỉ định nơi chúng tôi
muốn di chuyển con trỏ, nơi chúng tôi thực sự đọc hoặc ghi trong tệp.
Sau đó, chúng tôi sử dụng fputs để bất cứ nơi nào chúng tôi chuyển nó đến.
Và sau đó vị trí fset sẽ một lần nữa đặt một cái gì đó cụ thể ở nơi chúng tôi muốn
viết thư và sau đó viết nó từ bất cứ nơi nào chúng tôi muốn.
Vì vậy, với tất cả các chức năng này, bạn thực sự muốn xem nơi bạn đang
trỏ đến.
Điều này sẽ trở nên dễ dàng hơn hiểu một khi chúng tôi có thách thức của chúng tôi.
Vì vậy, với việc đọc và viết, bạn luôn muốn di chuyển đến một nơi nào đó mà
bạn đang viết thư.
Bạn không phải lúc nào cũng muốn viết cho phần đầu hoặc phần cuối.
Và vì vậy các chức năng này rất hữu ích để di chuyển đến nơi bạn muốn
định vị ở bất kỳ đâu trong tệp.
Cảm ơn bạn