2011-05-05 61 views
0

看這個小的代碼,它打開一個ifstream的:問題與ifstream的

std::ifstream _fcs; 

bool openFile(char* path) 
{ 
    istream::pos_type pos; 
    int tmp = 0; 

    _fcs.open(path, fstream::binary | fstream::in); 

    if(!_fcs.is_open()) 
     return false; 

    tmp = 0; 
    pos = 0x404; 

    _fcs.seekg(0x404); 
    pos = _fcs.tellg(); /// return zero 

    _fcs >> tmp; /// 
    _fcs.read((char*)&tmp, 4); 

    return true; 
} 

我有兩個問題。

  1. seekg後,所以tellg返回零,當我讀數據從文件的開頭讀取。
  2. 運營商>>似乎不起作用。總是歸零!

//// ---------------------------------------- --------
感謝您的關注。我發現了一個瘋狂的解決方案,但我感到困惑! 如果我叫seekg兩次,它的工作原理,看到這種代碼:

bool openFile(char* path) 
{ 
    istream::pos_type pos; 
    int tmp; 
    bool fail; 

    _fcs.open(path, fstream::binary | fstream::in); 

    if(!_fcs.is_open()) 
     return false; 

    _fcs.seekg(0x402); 
    _fcs.seekg(0x402); /// When it comments, the tellg returns 0. am i crazy!? 

    fail = _fcs.fail(); 
    assert(!fail); 

    pos = _fcs.tellg(); /// return 0x402!!! 

    /// _fcs >> tmp; 
    _fcs.read((char*)&tmp, 4); 

    return true; 
} 

真的,發生了什麼?
//// -------------------------------------------- ----

請幫我...
感謝先進。

回答

0

在二進制模式下,>>不應該工作,你必須使用ostream :: write。

您的文件是否真的存在並且有一個大小?如果注意,你不能「移動」到空文件中的任意點。

+0

是的,它的存在。這是一個二進制文件,我也用十六進制編輯器打開它。我想讀不寫! :( – Mostafa 2011-05-05 03:42:29

+0

對不起,誤讀。使用istream :: read然後。 – 2011-05-05 03:46:07

+0

我使用它,但爲什麼seekg沒有改變get指針!!!! – Mostafa 2011-05-05 03:52:48

2

seekg調用之後使用_fcs.fail()檢查失敗位,以確保沒有指定無效的文件位置。

仔細檢查大小使用

_fcs.seekg(0,ios::end); 
int length = _fcs.tellg(); 

你還需要使用.read()得到LEN值,因爲文件是二進制

+0

我完成了,我編輯了我的問題,再次看到它.. 。 – Mostafa 2011-05-05 05:41:26

+0

@Mostafa我不知道爲什麼你必須調用它兩次。這次你使用了一個不同的幻數(0x402與0x404),所以我不確定你的文件在哪裏引導你。檢查文件的大小,並確保不超出這個大小。當你說它正在工作時,你的意思是你已經讀過你正在尋找的值,或者只是你已經移動了文件指針? – jonsca 2011-05-05 06:11:52