2017-05-15 32 views
-2

我有一個問題,在循環訪問一個文件並用計數器提取幾個字母以知道已提取多少個字符後,我該如何重新定位指針以指向返回第一個提取。以下是我迄今爲止嘗試:它錯了一個在提取字符後返回到文件中的特定位置

int get_length(ifstream &inp,int &length){ 
    int columns=0; 
    inp>>columns; 
    length++; 
    while(columns!=0) 
    { 
    inp>>columns; 
    length++; 
    } 
    if (!inp.good()) 
     inp.clear(); 

    inp.seekg(-length,std::ios::cur); 
    return length; 
} 

出於某種原因,它不會回到相同的長度,它變得,我試圖通過一個增加的長度,然後寫尋求功能我不不知道這裏出了什麼問題,我正在查詢我是否錯誤地使用了查找功能?

+0

該代碼將額外時間增加「長度」。如果讀入'columns'的值是零,它應該**不**增加'length'。 –

+0

考慮到跳過空格的數量會增加「長度」嗎? – Galik

+1

閱讀關於'std :: basic_istream :: tellg()'。 –

回答

0

我認爲問題是這樣的: 每當從fstream'inp'讀取一個整數值時,就會增加'length'。根據整數表示的寬度有多少字符,您將需要按該數量遞增長度。 fstream中的新行字符和其他空白字符。

如果您的測試數據包含:

10 
11 
12 
13 

然後在你閱讀13,你將消耗12個字節的文件數據的時間。 你的計數器只會增加4次。

你可以這樣做更容易,更準確地在你的函數開始發出呼叫

auto const position_start = inp.tellg(); 

,一旦你讀出的數據,你有興趣「倒帶」與一個起始位置來電

inp.seekg(position_start, std::ios::beg); 
+0

謝謝你的問題,空白的想法飛過我的頭 –

0

'ifstream的' 是 'basic_ifstream' 的專業化,所以 'ifstream的:: seekg()' 需要一個以字節爲單位(字符)的偏移量。但是,格式化輸入(對於int)會將當前位置前移若干字節(0或更多),因爲它會將輸入轉換爲整數值。在調用'seekg()'獲取新文件位置之前,在函數頂部使用'ifstream :: tellg()'來獲取當前文件位置,並調用另一個'tellg()'。兩個值的差異將是'長度'。

相關問題