2014-02-24 44 views
1

函數getline()達到我的文件 「in.txt」,它由2個字符串:EOF突然在ifstream的

abcde 
12345 

我有我的代碼:

#include <iostream> 
#include <fstream> 
int main() { 
    std::ifstream fileIn("in.txt", std::ios::in); 

    char* chPtr = new(char[10]); 
    char ch; 

    printf("fileIn.get()==EOF?: %d \n", (fileIn.get() == EOF)); // =0 
    std::cout << "fileIn.eof() = " << fileIn.eof() << "\n"; // =0 

    fileIn.getline(chPtr, 3); 
    std::cout << "chPtr-" << chPtr << "\n"; //output:"bc" (see 1.) 
    fileIn.get(ch); 
    std::cout << "ch-" << ch << "\n"; //(see 2.) 

    printf("fileIn.get()==EOF?: %d \n", (fileIn.get() == EOF)); // =1 (see 3.) 
    std::cout << "fileIn.eof() = " << fileIn.eof() << "\n"; // =0 (see 4.) 

    fileIn.close(); 
    delete[] chPtr; 
} 

備註代碼:

1.)第一個符號'a'被get()略微超過;因此,在這裏讀取2個下一個符號,以及第三個符號,我想讀的是,getline()自動分配值'\ 0'(如果我理解正確的話)。

2.)這裏是問題 - 在這裏輸出符號(代碼[-52])。不幸的是,我沒有足夠的聲望發佈圖像=((這個符號像2個垂直的白線,這一對的右邊線與中間的間隙) (供參考:我每次都得到這個符號,我是想讀成char char數組變量未初始化的元素。) 但爲什麼我得到它的存在?因爲有1弦&整個第二根弦仍然unreaded符號!

()事實證明但是爲什麼我不明白

4.)我們在這裏仍然是零,因爲(如果我理解了co正確),沒有試圖在eof-line後面讀取數據。光標移動到位於文件的最後一個符號後面,但不在文件結束邊界之外)。

+1

我完全不知道你在問什麼。 –

+0

我問(爲什麼簡潔),爲什麼在語句fileIn.get(ch)之後;我沒有得到ch =='d',但是用char-code -52 // ch。 (int)ch == - 52 – user1234567

回答

1

如果istream::getline設法讀count-1字符(count是3在你的例子)達到EOF之前,它將設置failbit。請參閱reference

這意味着除非您清除該標誌,否則所有進一步的提取都將失敗,而不是「光標移動到最後」。 ch永遠不會被初始化。

+0

如果我正確理解了[信息](http://www.cplusplus.com/reference/istream/istream/getline/),則設置'fialbit'標誌,當: count-1)'字符爲紅色且沒有達到EOF或delim, - 下一個字符('count-1'後面)也不是delim。 感謝您的提示。 我還是不明白,爲什麼檢查EOF時給我'true'當失敗位標誌設置,但我認爲,這是這個標誌集的副作用。 – user1234567