2013-02-07 198 views
0

下面的代碼:爲什麼seekg函數不起作用?

#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std; 

int main(int argc, char *argv[]) 
{ 
    string infile(argv[1]); 
    ifstream fin(infile.data()); 

    string var_name; 
    char ch = fin.get(); 
    cout << ch << endl; 

    ch = fin.get(); 
    cout << ch << endl; 

    ch = fin.get(); 
    cout << ch << endl; 

    cout << "pos: " << fin.tellg() << endl; 
    fin.seekg(-sizeof(char),ios::cur); 
    cout << "pos: " << fin.tellg() << endl; 

    ch = fin.get(); 
    cout << ch << endl; 

    return 0; 
} 

文件內容只是一個字符串:

< 
? 
x 
m 

,輸出是:

<\n 
?\n 
x\n 
pos: 3\n 
pos: 2 
x 

爲什麼打印的最後一個字符還是 'X' ??爲什麼不看seekg函數將文件指針移回一個字節?

回答

3

讀取x後,文件指針的位置是3 ,但x本身位於位置2(因爲第一個字符位於位置0)。向後移動1個字符會將文件指針放在最近讀取的字符上,這正是這裏發生的情況。

如果您想要在讀取最後一個字符之前移動到字符,則需要通過-2而不是-1來查找。

2

如果你這樣做,它將正常工作:fin.seekg(-sizeof(char)-1,ios::cur);

注:尋求在文本文件中的任意位置是未定義的行爲。看到這裏:How to read the 6th character from the end of the file - ifstream?

+0

'sizeof(char)'總是1.你可能會寫-2。 – Alex

+0

這是爲了完整:-P @Alex。 OP會理解我是否以這種方式編寫它,因爲他已經嘗試將它寫爲'-sizeof(char)'。 –

+1

然後它應該是'-sizeof(char)* 2' :) – Alex

相關問題