2015-10-20 100 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流的最后一个字符,然后再读。