標準C的文件操做函數不支持對超過2G的文件讀取

前幾天在工做中須要寫一段代碼,獲取一些文件的大小,心想:這還不簡單嗎?直接用標準C 的文件操做函數就OK了。因而寫了下面的一段代碼來實現: 函數

unsigned long get_file_size(const char *filename)
{
    unsigned long size;
    FILE* fp = fopen( filename, 「rb」 );
    if(fp==NULL)
    {
        printf(「ERROR: Open file %s failed.\n」, filename);
        return 0;
    }
    fseek( fp, SEEK_SET, SEEK_END );
    size=ftell(fp);
    fclose(fp);
    return size;
}
測試

沒有想到的是,在程序執行後發現有的文件能正確的獲取大小,而有的文件則不能正確的獲取到文件大小,檢查了代碼,也沒有發現有什麼不對的地方。可是在這過程當中發現了一個問題,就是能正確獲取大小的文件都是相對比較小的文件,而出現錯誤的都是很大的文件。因而想到會不會是由於標準C文件操做函數對超過必定大小的文件不支持所形成的呢,因而Google了一下,沒想到個人猜想是正確的,標準C的文件操做函數不支持對超過2G的文件讀取。 spa

問題找到了,看來只有換一種方法來實現了,由於平時不多用到標準C的一些函數,因此,又只有求助了,在看了網上很多的參考文章以後,發現調用stat函數能夠正確的獲得超大文件的狀態信息(固然包括文件大小),因而最終實現了以下的代碼: get

unsigned long get_file_size(const char *filename)
{
    struct stat buf;
    if(stat(filename, &buf)<0)
    {
        return 0;
    }
    return (unsigned long)buf.st_size;
}
file

從寫這麼一個小小功能的函數能夠看出,平時多積累一些計算機方面的知識真的是很重要的,同時對代碼的全面測試也是至關重要的,不然,看着很正確的代碼可能在某些狀況下會給你帶來意想不到的麻煩。 程序

相關文章
相關標籤/搜索