2012-08-25 7 views
10

Sự khác nhau giữa ftello/fseeko và fgetpos/fsetpos là gì? Cả hai dường như là con trỏ tập tin nhận được/thiết lập các chức năng sử dụng loại bù đắp đục để đôi khi cho phép bù đắp 64 bit.ftello/fseeko vs fgetpos/fsetpos

Chúng có được hỗ trợ trên các nền tảng khác nhau hoặc theo các tiêu chuẩn khác nhau không? Là một linh hoạt hơn trong loại bù đắp nó sử dụng?

Và, nhân tiện, tôi biết về số fgetpos/fsetpos and ftell/fseek, nhưng đây là không phải là trùng lặp. Câu hỏi đó hỏi về ftell/fseek và câu trả lời là không phải là áp dụng cho ftello/fseeko.

+0

Lưu ý rằng 'off_t' được trả về bởi' ftello' không thực sự là một kiểu dữ liệu mờ; nó chỉ là một số nguyên đã ký. Nó có thể là 32-bit hoặc 64-bit tùy thuộc vào nền tảng của bạn và cờ biên dịch, mặc dù. Tương tự, 'fpos_t' có thể không phải là 64 bit nếu' _FILE_OFFSET_BITS'! = 64. – nneonneo

+0

Tôi đoán ý tôi là kiểu dữ liệu mờ là nó không thuộc loại cố định trong mã của người dùng. Tôi đoán nó không hoàn toàn mờ đục, bởi vì kiểu dữ liệu chỉ có thể được thay đổi tại thời gian biên dịch, không phải ở thời gian liên kết động. –

+2

Ah. Tôi thường sử dụng mờ theo nghĩa 'cấu trúc với bố cục không công khai', như fpos_t là. – nneonneo

Trả lời

8

Xem Portable Positioning để biết thông tin chi tiết về sự khác biệt. Một đoạn trích:

Trên một số hệ thống nơi luồng văn bản thực sự khác với luồng nhị phân, không thể biểu thị vị trí tệp của luồng văn bản dưới dạng số ký tự từ đầu tệp. Ví dụ, vị trí tệp trên một số hệ thống phải mã hóa cả bản ghi bù trừ trong tệp và một ký tự bù trong bản ghi.

Do đó, nếu bạn muốn chương trình của bạn để được cầm tay để các hệ thống này, bạn phải tuân thủ quy tắc nhất định:

  • Các giá trị trả về từ ftell trên một dòng văn bản không có mối quan hệ có thể dự đoán với số ký tự bạn đã đọc cho đến nay. Điều duy nhất bạn có thể dựa vào là bạn có thể sử dụng nó sau đó làm đối số offset cho fseek hoặc fseeko để quay lại vị trí tệp tương tự.
  • Trong cuộc gọi tới fseek hoặc fseeko trên luồng văn bản, giá trị chênh lệch phải bằng 0, hoặc phải là SEEK_SET và giá trị chênh lệch phải là kết quả của cuộc gọi trước đó để quay trên cùng một luồng.
  • Giá trị của chỉ báo vị trí tệp của luồng văn bản không xác định trong khi có các ký tự đã được đẩy trở lại với ungetc chưa được đọc hoặc bị hủy. Xem Unreading.

Tóm lại: fgetpos/fsetpos sử dụng một cấu trúc linh hoạt hơn để lưu trữ siêu dữ liệu bổ sung về tình trạng vị trí tập tin, tạo điều kiện cho tính di động cao hơn (về mặt lý thuyết).