2011-09-08 21 views
8

Nếu tôi sử dụng một cái gì đó như double để giữ kích thước tệp theo byte, điều này sẽ tự động thất bại rất sớm, vậy tôi sẽ sử dụng loại dữ liệu nào? Ngày nay một vài bệnh lao là phổ biến, vì vậy tôi muốn kiểu dữ liệu có thể chứa một số lượng lớn.C: Loại dữ liệu phù hợp để sử dụng cho kích thước tệp theo byte là gì?

+0

+1 để làm phiền hỏi thay vì chỉ sử dụng một cái gì đó không có thật. :-) Và chào mừng bạn đến với SO! –

Trả lời

6

Nó sẽ tùy thuộc vào nền tảng của bạn. Trên hệ thống Unix, bạn có thể sử dụng loại off_t. Trên Windows, có thể bạn sẽ muốn sử dụng LARGE_INTEGER. Đó là các loại được sử dụng trên các hệ thống đó bởi hàm trả về kích thước tệp (stat trên Unix, GetFileSize trên Windows).

Nếu bạn muốn loại di động, uint64_t phải đủ lớn.

+0

Sau phiên Google nhanh, có vẻ như uint64_t là thứ tôi muốn. Cảm ơn! Tôi bị choáng ngợp bởi số lượng phản hồi và thời gian phản hồi. SO là tuyệt vời! – EnibMoc1994

+1

@ EnibMoc1994: Bạn cũng có thể sử dụng 'long long' hoặc đối tác chưa ký của nó, được đảm bảo ít nhất 64 bit. – caf

1

long long là một Pop yêu thích :)

1

size_t là thông thường cho kích thước file trong C, nhưng kiểu của nó là nền tảng phụ thuộc (32-bit hoặc 64-bit unsigned int trên Windows). Tôi muốn đề nghị __int64 (một int 64-bit) - nên đối phó với lên đến 138,547,332 terrabyte.

CHỈNH SỬA: Chỉ cần kiểm tra, lệnh gọi API Windows GetFileSizeEx giúp bạn có LARGE_INTEGER, là số nguyên có ký hiệu 64 bit. Vì vậy LARGE_INTEGER cũng sẽ là một điều tốt.

+2

Đối với bản ghi, 'size_t' có kích thước 64 bit trong bản 64bit. –

+0

Nó là _not_ một 'unsigned int', nó là một loại tích phân không dấu. – paxdiablo

+0

Xin lỗi, @paxdiablo, nó thực sự phụ thuộc vào nền tảng như bạn ngụ ý. Trên Windows sử dụng 32-bit, nó tương đương với một int không dấu. Thời gian qua tôi tin tưởng những gì Visual Studio nói với tôi. :) Đã chỉnh sửa câu trả lời của tôi chính xác hơn. Thông tin thêm ở đây: http://en.wikipedia.org/wiki/Size_t –

2

Có chức năng được gọi là ftello() trả về số off_t.

Với fgetpos(), bạn cần biến số fpos_t - CHỈNH SỬA: không nhất thiết phải là loại số học.

Vì vậy, off_t có thể/nên phù hợp để phù hợp với nhu cầu của bạn và giúp bạn không phụ thuộc vào kích thước loại dữ liệu thực tế.

+0

Chỉ cần cẩn thận rằng 'ftello' và' off_t' là Posix, không chuẩn C. –

+0

Nếu bạn không có 'off_t' bạn không có' ftello' hoặc là và không có (di động) cách để có được một tập tin bù đắp lớn hơn hơn 'long' ... –

1

Bạn có thể muốn xem xét sử dụng off_t, vì đây là những chức năng tiêu chuẩn như sử dụng fseeko và sử dụng ftello.

1

libc stat sử dụng off_t, là typedef cho loại rộng, không dấu 64 bit. Điều đó sẽ phù hợp trong một thời gian ngắn.

+0

off_t là typedef cho chữ ký dài lâu trên OS X. –

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