2015-10-20 92 views
0

我想在同一個流上使用兩次fgets。我已經定義了兩個指向同一個文件的文件指針,但是當我在其中一個指針上使用fgets時,另一個也會被修改。如何複製文件指針

fun(FILE * input) { 
    FILE * input_dup=input; 
    char str[2]; 
    fgets(str, 2, input); 
    fgets(str, 2, input_dup); 
} 

在第二次調用與fgets,爲什麼它讀取下一個字符。應該給予同樣的輸出,因爲它們都指向同一個位置

+1

您複製了一個指針,都指向同一個對象。另外,你的代碼不是標準的C++。實際的類型可能是'FILE *'而不是'File *'? –

+1

查看http://stackoverflow.com/questions/6099315/duplicating-file-pointers –

+0

@ Jean-BaptisteYunès:對X的好玩,但我認爲這是一個XY問題。 – Deduplicator

回答

1

那麼,你是下基本勞動誤解:

如果你複製一個指針,那不是複製它指向的對象。

碰巧,沒有複製FILE的標準方法(雖然有非標準方法,請參閱:Duplicating file pointers?)。
這不會發生,你是SOL,你可以使用ftell來獲得當前位置,然後fseek返回那裏(假設流是可搜索的,就像文件一樣)。

+0

我只是假設你實際上正在處理'FILE *'並忘記了返回類型'void',否則這個問題就沒有任何意義。 – Deduplicator

+0

是的,但是如果增加一個複製的指針,原始文件不會增加。誤解可能源於一種信念,即「文件指針」本身就是一個指向文件的指針,當數據被讀取時,文件通過文件遊行。 :) – Kaz

+0

@deduplicator:謝謝..即使我已經實現了,它使用ftell和fseek。但我想知道我在上面的代碼中做錯了什麼。 – Inam

-1

與所有C++編碼一樣,它正在按照您所說的去做。如果你想要另一個副本,你可以創建一個覆蓋函數,告訴系統讀取和操作並複製流並返回一個指向數組的指針。那會實現你的目標。

第二個解決方案將unget流的最後一個字符,然後再讀。