2013-04-04 66 views
2

試圖寫入一個文件,該文件從文件的第一個字節讀取到用戶指定的字節。我需要關於邏輯的幫助。如果文件只有字母a到z,而我只想讀取並顯示前10個字符,例如。這裏有一張我寫的:從文件開頭到指定字節的C++讀取

char byte; 
    inFile.seekg(0L,ios::beg); 
    inFile.get(byte); 
    cout << byte; 

    for(int i = 0; i < num; i++); //num is an int specified by the user. 
    { 
     inFile.seekg(1, ios::cur); 
     inFile.get(byte); 
     cout << byte; 
    } 
+0

你的問題是什麼?代碼是否工作?如果不是,問題是什麼? – Barmar 2013-04-04 23:14:33

+3

您的問題可能是您在每次讀取後不需要前進1個字節。 'get'調用已經做到了。您的代碼可能會跳過每個第二個字節。另外,除了循環之前的get之外,你還讀取了比你需要的多一個字節,因爲你的循環從0到num-1。 – MatthewD 2013-04-04 23:17:20

+0

'seek'用於當你不想從文件開始時順序讀取。 – Keith 2013-04-04 23:34:02

回答

1

第一個問題 - 在for()行結束的分號:

for(int i = 0; i < num; i++); 
    { 
     ... 
    } 

什麼編譯器看到的實際上是這樣的:

for(int i = 0; i < num; i++) { /* do nothing num times */ } 

    { 
     // code that will only run once 
    } 

所以,刪除分號。

接下來,如果您只是連續讀取字節,則無需在每個字節之間尋找。只要調用get()就會得到序列中的下一個字節。因此請刪除seekg()調用。

最終的問題 - 此功能實際上是呼籲inFile.get()num + 1次。第一個呼叫在for循環之前。然後在for循環中,get()被稱爲num次(即,i = 0,1,2,3 ... num-1)。您可以通過將for環路計數器更改爲(i = 1; i < num; i++)或僅刪除for環路之前的get()呼叫來解決此問題。在下面的代碼中我選擇了第二種方式:

void run(int num, istream &inFile) 
{ 
    char byte; 

    for(int i = 0; i < num; i++) 
    { 
     inFile.get(byte); 
     cout << byte; 
    } 
}