2012-01-03 34 views
5

Tôi cần chuyển một số giá trị sang phương pháp fseek() trong C lớn hơn giá trị lớn nhất của loại ký dài (2147483647). Nhưng nếu tôi làm như dưới giá trị của kết quả là -1 mà không phải là thành công. Có anyway mà tôi có thể làm điều này?Vượt qua giá trị lớn hơn giá trị lớn nhất của loại dài tới fseek trong C

//fp is the pointer to fopen method 
unsigned long long index=2147483648; 
int status = fseek(fp, index, SEEK_SET); 
+0

wow ... loại tệp khổng lồ nào là điều này đòi hỏi phải tìm kiếm ở đâu đó lâu hơn nhiều so với giá trị tối đa của unsigned long? –

+1

@MichaelDautermann tệp 2GB không có gì. Tôi đã xử lý (duy nhất) các tệp lớn hơn '6 TB'. – Mysticial

+1

@MichaelDautermann: Chúng tôi đang ở trong năm 2012, cách tệp 2GB là một 'tệp khổng lồ dữ dội'? – ybungalobill

Trả lời

9

Vì bạn đã gắn thẻ mục này với "Objective-C", tôi giả sử bạn cũng đang nghĩ về Macintosh.

Check out fseeko (có số 64 bit).

+0

+1. Lợi ích của điều này là chiều rộng của 'off_t' được nướng thành 32 hoặc 64-bit. –

+1

(Được bổ sung bằng cách sử dụng tùy chọn biên dịch '-D_FILE_OFFSET_BITS = 64'.) –

+0

thnx cho giải pháp :) – user1120633

6

Bạn cần phải sử dụng phiên bản 64-bit của fseek():

  • Windows: _fseeki64()
  • Linux: fseeko() với #define _FILE_OFFSET_BITS 64 hoặc -D_FILE_OFFSET_BITS=64

Và đối với lseek():

  • Windows: _lseeki64()
  • Linux: lseek() với #define _FILE_OFFSET_BITS 64 hoặc -D_FILE_OFFSET_BITS=64

Ngoài ra còn có lseek64(), nhưng như đã đề cập bởi @R .. (xem chú thích), nó không nên được sử dụng.

+2

'lseek64' là phiên bản 64 bit của' lseek', không phải 'fseek', nhưng có lẽ quan trọng hơn nó không bao giờ được sử dụng. Thay vào đó biên dịch ** mọi thứ ** với '-D_FILE_OFFSET_BITS = 64' (điều này không phải là một lựa chọn; nó sẽ là mặc định và bạn nên đặt nó trong tất cả các tệp makefiles của dự án) và sử dụng hàm chuẩn' fseeko'. –

+0

Ah vâng, bạn nói đúng, gimme một phút. để làm cho điều đó đúng. Tôi sẽ đề cập đến cả 'lseek' và 'fseek'. – Mysticial

+0

@R. Những thay đổi đã làm. Hãy cho tôi biết nếu có bất cứ điều gì khác tôi nên sửa chữa. – Mysticial

Các vấn đề liên quan