2013-12-10 33 views
2

文件的大小,我有以下塊測試seekg和所以tellg的行爲,當我試圖得到一個文件大小:得到與ifstream的:: seekg和所以tellg

int size = 0; 
    ifstream in(fileName.c_str(), ifstream::in | ifstream::binary); 
    if(in) 
    { 
     in.seekg(0,ifstream::end); 
     size = in.tellg(); 
     cout << endl; 
     cout << endl; 
     cout << "********** size stream1*** =" << size << endl; 
     in.seekg(0,ios::end); 
     size = in.tellg(); 
     cout << "********** size stream2*** =" << size << endl; 
     in.seekg(0,ios::end); 
     size = in.tellg(); 
     cout << "********** size stream3*** =" << size << endl; 
     in.seekg(100,ios::end); 
     size = in.tellg(); 
     cout << "********** size stream4*** =" << size << endl; 
     in.seekg(0,ios::beg); 
     size = in.tellg(); 
     cout << "********** size stream5*** =" << size << endl; 
     in.seekg(100); 
     in.seekg(0, ios::end); 
     size = in.tellg(); 
     cout << "********** size stream6*** =" << size << endl; 
     in.seekg(100); 
     in.seekg(0, ios::cur); 
     size = in.tellg(); 
     cout << "********** size stream7*** =" << size << endl; 
     in.seekg(-100,ios::end); 
     size = in.tellg(); 
     cout << "********** size stream8*** =" << size << endl; 
     in.seekg(ios::beg,ios::end); 
     size = in.tellg(); 
     cout << "********** size stream9*** =" << size << endl; 
     in.seekg(ios::beg); 
     in.seekg(ios::end); 
     size = in.tellg(); 
     cout << "********** size stream10*** =" << size << endl; 
     cout << endl; 
     cout << endl; 
    } 

其結果如下:

********** size stream1*** =1846 
********** size stream2*** =1846 
********** size stream3*** =1846 
********** size stream4*** =1946 
********** size stream5*** =0 
********** size stream6*** =1846 
********** size stream7*** =100 
********** size stream8*** =1746 
********** size stream9*** =1846 
********** size stream10*** =2 

我的問題有以下幾點:

  1. 做的所以tellg將返回字節ŧ他最後seekg找到了?
  2. 爲什麼stream5結果是0?它以前的位置是在文件的末尾。
  3. seekg將始終從文件開頭處開始,如stream5所示?
  4. seekg不能倒退如stream5所示?
  5. seekg的第一個參數是什麼意思?它表示這是第二個參數的偏移量。它看起來超出了第二個參數指定的位置,如果它是一個正值,如stream4中所示。
  6. 如果我想知道前100個字節後的大小,我必須使用-100,如stream8
  7. 爲什麼stream10是2?
  8. seekptellp在ofstream的有屬性seekg所以tellg在這裏?
+0

tellg返回文件的當前位置。 **閱讀手冊頁**順便說一句,你只有一個流。 –

+2

你調用in.seekg(0,ios :: beg);在stream5之前。爲什麼它不是0? – cen

+0

也爲6,爲什麼不簡單地得到完整的大小和減去100?如果文件低於100字節,則可以將該位置設置在流開始位置的下方。我測試了這一點,併爲一個較小的文件返回大小爲-1,我相信是故障位錯誤集。 – cen

回答

3

OK,我們開始吧:

  1. tellg()將產生的位置對象要回你所在的位置是有用的。返回的類型是std::streampos,即std::fpos<std::mbstate_t>。但是,std::fpos<std::mbstate_t>將轉換爲一個整數的std::streamoff。基本上,std::streampos轉換爲從第一個位置到當前位置的字符數。
  2. 尋找到0相對於std::ios_base::beg的字符清楚地將位置設置爲文件的開頭。你的意思是使用std::ios_base::cur
  3. seekg()將相對於開始,當前位置,或取決於何處參數是std::ios_base::begstd::ios_base::cur,或std::ios_base::end結束。
  4. 不可以。您可以使用負偏移量向後移動。
  5. 參見3 .:第一個參數是相對於由參數指定的位置移動的偏移量。
  6. No.如果您知道文件中有多少個字符,則可以從該數字中減去100。
  7. 您使用絕對定位,使用,其中值爲位置。 std::ios_base::seekdir類型是枚舉,並且std::ios_base::end可能具有值2
  8. 非常多。