2010-02-17 36 views
10

Tôi đang sử dụng Linux và C++. Tôi có một tập tin nhị phân với kích thước của 210.732 byte, nhưng kích thước báo cáo với seekg/tellg là 210728.C++: Nhận kích thước tệp không chính xác

tôi nhận được các thông tin sau từ ls-la, tức là 210.732 byte:

-rw -rw-r-- 1 PJS PJS 210.732 17 tháng 2 10:25 output.osr

Và với đoạn mã sau, tôi nhận được 210.728:

std::ifstream handle; 
handle.open("output.osr", std::ios::binary | std::ios::in); 
handle.seekg(0, std::ios::end); 
std::cout << "file size:" << static_cast<unsigned int>(handle.tellg()) << std::endl; 

Vì vậy, mã của tôi là tắt của 4 byte . Tôi đã xác nhận rằng kích thước của tập tin là chính xác với một trình soạn thảo hex. Vậy tại sao tôi không nhận được kích thước chính xác?

Câu trả lời của tôi: Tôi nghĩ rằng vấn đề là do có nhiều fstream mở cho tệp. Ít nhất điều đó dường như đã sắp xếp nó ra cho tôi. Cảm ơn mọi người đã giúp đỡ.

+0

Đây có phải là trường hợp trên tất cả các hệ thống tập tin (trong trường hợp bạn có một số)? – hlovdal

+0

Thật không may, tôi không có tùy chọn để kiểm tra trên một hệ thống tệp khác. – PSJ

+0

Hoạt động tốt trên hệ thống Ubuntu 32 bit của tôi. Bạn có sử dụng g ++? – tur1ng

Trả lời

3

Ít nhất đối với tôi với G ++ 4.1 và 4.4 trên CentOS 5 64 bit, mã bên dưới hoạt động như mong đợi, tức là độ dài chương trình được in ra giống với độ dài được trả về bởi lệnh gọi stat().


#include <iostream> 
#include <fstream> 
using namespace std; 

int main() { 
    int length; 

    ifstream is; 
    is.open ("test.txt", ios::binary | std::ios::in); 

    // get length of file: 
    is.seekg (0, ios::end); 
    length = is.tellg(); 
    is.seekg (0, ios::beg); 

    cout << "Length: " << length << "\nThe following should be zero: " 
     << is.tellg() << "\n"; 

    return 0; 
} 
+0

Cảm ơn bạn. Đáng ngạc nhiên, điều này thực sự mang lại cho tôi câu trả lời đúng. Tôi không hiểu tại sao, nhưng nó cung cấp cho tôi kết quả tôi đang tìm kiếm. – PSJ

+0

nhưng thats chính xác cùng một mã-ngoài các tĩnh đúc để unsigned int – pm100

+0

Vâng, tôi phải có một cái gì đó ở đâu đó, đó là can thiệp. Tôi đang cố gắng tìm ra. – PSJ

9

Tại sao bạn mở tệp và kiểm tra kích thước? Cách đơn giản nhất là để làm điều đó một cái gì đó như thế này:

 
#include <sys/types.h> 
#include <sys/stat.h> 

off_t getFilesize(const char *path){ 
    struct stat fStat; 
    if (!stat(path, &fStat)) return fStat.st_size; 
    else perror("file Stat failed"); 
} 

Edit: Cảm ơn PSJ để chỉ ra một lỗi đánh máy trục trặc nhỏ ... :)

+0

tôi nhận thấy điều này đã được downvoted sau đó bỏ phiếu tán tại sao.? – t0mm13b

+1

Có lẽ vì nó không trả lời câu hỏi –

+0

@Neil: Oh ... Anh ấy đã nói về việc mở tệp và tìm cách kết thúc để có kích thước và trả về kết quả không chính xác ... Tôi đã tự hỏi tại sao không sử dụng chức năng thay vì phải mở/đóng tệp ...? – t0mm13b

1

Có thể ls -la thực sự báo cáo số byte tệp chiếm trên đĩa, thay vì kích thước thực tế của nó không? Điều đó sẽ giải thích tại sao nó cao hơn một chút.

+0

Đó cũng là suy nghĩ của tôi. Tôi đang tạo ra các tập tin bản thân mình và tôi đang đưa 210732 byte vào tập tin, cũng khi tôi kiểm tra các tập tin với ghex2 nó thực sự chứa tất cả các byte. – PSJ

2

Khi ở trên một hương vị của Unix, tại sao chúng ta sử dụng rằng, khi chúng ta có utlilty stat

long findSize(const char *filename) 
{ 
    struct stat statbuf; 
    if (stat(filename, &statbuf) == 0) 
    { 
     return statbuf.st_size; 
    } 
    else 
    { 
     return 0; 
    } 
} 

nếu không,

long findSize(const char *filename) 
{ 
    long l,m; 
    ifstream file (filename, ios::in|ios::binary); 
    l = file.tellg(); 
    file.seekg (0, ios::end); 
    m = file.tellg(); 
    file.close(); 
    return (m – l); 
} 
Các vấn đề liên quan