# \[Bug #2516\] IO#reopen Compatibility (original: )

**URL:** <https://www.ruby-forum.com/t/bug-2516-io-reopen-compatibility-original/183289>\
**Category:** Development\
**Created:** [February 11, 2010, 7:28am UTC](https://www.ruby-forum.com/t/bug-2516-io-reopen-compatibility-original/183289 "2010-02-11T07:28:28Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Yusuke\_E](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/f08c70/32.png) [@Yusuke\_E](https://www.ruby-forum.com/u/Yusuke_E)\
**Post date:** [February 11, 2010, 7:28am UTC](https://www.ruby-forum.com/t/bug-2516-io-reopen-compatibility-original/183289/1 "2010-02-11T07:28:28Z")

</div>

e$B%A%1%C%He(B #2516 e$B$,99?7$5$l$^$7$?!#e(B (by Yusuke E.)

e$B1sF#$G$9!#e(B

IO#reopen e$B$K$D$$$FD4$Y$F$$$k$N$G$9$,!"$5$C$Q$j$o$+$j$^$;$s!#e(B

$ cat foo.txt  
1  
2  
3

# 1.8: e$BESCf0LCV$Ne(B File e$B$Ke(B reopen e$B$7$?$iFI$\_9~$a$J$$e(B

f1, f2 = File.new(“foo.txt”), File.new(“foo.txt”)  
f2.gets  
f1.reopen(f2)  
p f1.gets #=\> nil  
p f1.gets #=\> nil  
p f1.gets #=\> nil  
p f1.pos #=\> 2

# 1.9: reopen e$B$7$?8e$Oe(B get e$BAa$$!$A!)e(B pos

e$B$N7k2L$,0c$&e(B  
f1, f2 = File.new(“foo.txt”), File.new(“foo.txt”)  
f1.reopen(f2)  
p f1.gets #=\> “1\n”  
p f2.gets #=\> nil  
p f1.pos #=\> 2  
p f2.pos #=\> 2

f1, f2 = File.new(“foo.txt”), File.new(“foo.txt”)  
f1.reopen(f2)  
p f2.gets #=\> “1\n”  
p f1.gets #=\> nil  
p f1.pos #=\> 6  
p f2.pos #=\> 2

reopen e$B$NA[Dj%f!\<%9%1!\<%9$C$F$I$s$J$s$G$7$g$&$+!#e(B  
dup2  
e$B$N$h$&$J$b$N$+$H;W$C$F$$$?$N$G$9$,!"$=$s$J5sF0$G$b$J$$$G$9$h$M!#e(B  
e$B%f!\<%9%1!\<%9\<!Bh$G$O!"e(Breopen e$B$N0z?t$KEO$5$l$?e(B IO e$B$Oe(B  
close e$B$7$F$7$^$&e(B  
e$BJ}$,:.Mp$7$J$/$F$9$`$H;W$$$^$9!#e(B

# 

e$B$G$-$l$P%f!\<%9%1!\<%9$N5DO@$NA0$K5sF0$,JQ$o$C$?M}M3$rGD0.$7$?$+$C$?e(B

# e$B$N$G$9$,!"2?$,%P%0$G2?$,;EMM$+$o$+$j$^$;$s$G$7$?!#e(B

## – Yusuke E. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

[http://redmine.ruby-lang.org/issues/show/2516](http://redmine.ruby-lang.org/issues/show/2516)

---

<div class="post-metadata">

**Author:** ![Yusuke\_E](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/f08c70/32.png) [@Yusuke\_E](https://www.ruby-forum.com/u/Yusuke_E)\
**Post date:** [February 15, 2010, 5:26am UTC](https://www.ruby-forum.com/t/bug-2516-io-reopen-compatibility-original/183289/2 "2010-02-15T05:26:12Z")

</div>

> > Â 1  
> > Â p f1.pos Â #=\> 2  
> > Â f1.reopen(f2)
> 
> ```
> char buf[80];
> printf("pos %d\n", ftell(f2));
> 
> ```
> 
> pos 6
> 
> å†…éƒ¨çš„ã«ã¯ struct FILEãŒ struct \_IO\_marker ã‚’ãƒã‚¤ãƒ³ãƒˆã—ã¦ã„ã¦ã€ \_IO\_markerã¯å…±æœ‰ã€ãã£ã¡ã§posç®¡ç†ã—ã¦ã„ã‚‹ã€‚

åå¿œãŒãªã„ã®ã§ã€èª°ã‚‚èˆˆå‘³ãŒãªã„ã®ã ã¨åˆ¤æ–­ã—ã¾ã™ã€‚é è—¤ã•ã‚“ã¨IRCã§èª¿æ•´ã®ã†ãˆ  
kosakiãŒãƒœãƒ¼ãƒ«ã‚’æ¡ã‚‹ã“ã¨ã«ã—ã¾ã—ãŸã€‚  
ç¾çŠ¶ io.dup ã‚‚posãŒç‹‚ã£ãŸå‹•ãã‚’ã—ã¦ã„ã‚‹ã®ã§ä¸€ç·’ã«ç›´ã™ã“ã¨ã«ãªã‚‹ã¨æ€ã„ã¾ã™ã€‚

# ãŸã¶ã‚“ã€æœˆæœ«ã®Tokyo Ruby Kaigiã®ãƒãƒ³ã‚ºã‚ªãƒ³ã§Hello Worldã¨ã‹

# æ•™ãˆã¦ã‚‚ã‚‰ã„ãªãŒã‚‰ã€å†…è·ãƒãƒƒã‚¯ã™ã‚‹äº‹ã«ãªã‚Šãã†ã€‚

---

<div class="post-metadata">

**Author:** ![Yusuke\_E](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/f08c70/32.png) [@Yusuke\_E](https://www.ruby-forum.com/u/Yusuke_E)\
**Post date:** [February 13, 2010, 6:06am UTC](https://www.ruby-forum.com/t/bug-2516-io-reopen-compatibility-original/183289/3 "2010-02-13T06:06:40Z")

</div>

2010å¹´2æœˆ11æ—¥15:24 Yusuke E. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> Â 2
> 
> Â p f2.gets #=\> “1\n”
> 
> # ã§ãã‚Œã°ãƒ¦ãƒ¼ã‚¹ã‚±ãƒ¼ã‚¹ã®è­°è«–ã®å‰ã«æŒ™å‹•ãŒå¤‰ã‚ã£ãŸç†ç”±ã‚’æŠŠæ¡ã—ãŸã‹ã£ãŸ
> 
> # ã®ã§ã™ãŒã€ä½•ãŒãƒã‚°ã§ä½•ãŒä»•æ§˜ã‹ã‚ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚

Linuxã ã¨åŒç­‰ã®ä»¥ä¸‹ã®Cãƒ—ãƒ­ã‚°ãƒ©ãƒ ãŒ

#include \<stdio.h\>

int main(void)  
{  
FILE \*f1, \*f2;  
char buf[80];

```
    f1 = fopen("inputfile", "r+");
    printf("%s", fgets(buf, 80, f1));
    f2 = freopen("inputfile", "r+", f1);

    printf("%s", fgets(buf, 80, f1));
    printf("%s", fgets(buf, 80, f1));
    printf("%s", fgets(buf, 80, f1));

    printf("pos %d\n", ftell(f1));
    printf("pos %d\n", ftell(f2));

```

}

ã“ã†ãªã‚Šã¾ã™ã€‚

1  
1  
2  
3  
pos 6  
pos 6

å†…éƒ¨çš„ã«ã¯ struct FILEãŒ struct \_IO\_marker ã‚’ãƒã‚¤ãƒ³ãƒˆã—ã¦ã„ã¦ã€  
\_IO\_markerã¯å…±æœ‰ã€ãã£ã¡ã§posç®¡ç†ã—ã¦ã„ã‚‹ã€‚

ã¾ãŸ SUSã‚’ã¿ã‚‹ã¨

[http://www.opengroup.org/onlinepubs/009695399/functions/freopen.html](http://www.opengroup.org/onlinepubs/009695399/functions/freopen.html)

æœ€åˆã«å¼•æ•°streamã‚’flushã—ã¦closeã™ã‚‹ã‚ˆã‚“ã€‚ã¨ã‹æ›¸ã„ã¦ã‚ã‚‹ã‘ã©ã€Linuxã¯å˜ã«dupã—ã¦ã‚‹ã ã‘ãªã‚“ã§closeã—ã¦ãªã„ã¿ãŸã„ã€‚ãªã‚“ã‹äº’æ›æ€§ã®ç†ç”±ãŒã‚ã‚‹ã®ã‹ãªï¼Ÿ

IOç³»ã¯è¦‹ã‚‹ã‹ã‚‰ã«æ¨™æº–Cãƒ©ã‚¤ãƒ–ãƒ©ãƒªã®å½±éŸ¿ãŒè‰²æ¿ƒã„ã®ã§ã€ã“ã‚Œã«åˆã‚ã›ã‚Œã°ã„ã„ã‚“ã˜ã‚ƒãªã„ã§ã—ã‚‡ã†ã‹ã­ã‡ãƒ»ãƒ»ãƒ»  
nalshã•ã‚“ã‚ãŸã‚ŠãŒæ‚²é³´ã‚’ä¸Šã’ã‚‹æã‚ŒãŒã‚ã‚Šã¾ã™ãŒã€‚

---

<div class="post-metadata">

**Author:** ![Yusuke\_E](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/f08c70/32.png) [@Yusuke\_E](https://www.ruby-forum.com/u/Yusuke_E)\
**Post date:** [February 15, 2010, 2:08pm UTC](https://www.ruby-forum.com/t/bug-2516-io-reopen-compatibility-original/183289/4 "2010-02-15T14:08:16Z")

</div>

e$B1sF#$G$9!#e(B

2010e$BG/e(B2e$B7ne(B15e$BF|e(B13:25 KOSAKI Motohiro  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> e$BH?1~$,$J$$$N$G!"C/$b6=L#$,$J$$$N$@$HH=CG$7$^$9!#1sF#$5$s$He(BIRCe$B$GD4@0$N$&$(e(B  
> kosakie$B$,%!\<%k$r0.$k$3$H$K$7$^$7$?!#e(B  
> e$B8=\>ue(B io.dup e$B$be(Bpose$B$,68$C$?F0$-$r$7$F$$$k$N$G0l=o$KD\>$9$3$H$K$J$k$H;W$$$^$9!#e(B

IO e$B$H$+6=L#$J$$$N$G$h$m$7$/$\*4j$$$7$^$9!#e(B

e$B$"$H!"e(BIRC e$B$GOC$7$?e(B pos  
e$B$N$H$A68$C$?F0$-$K$D$$$F5-O?$G$9!#e(B

e$B!{e(B pos e$B$,Ii$K$J$ke(B

$ cat foo.txt  
1  
2  
3

f1 = File.new(“foo.txt”)  
f2 = File.new(“foo.txt”)  
f2.gets  
f1.reopen(f2)  
f2.gets  
f1.rewind  
p f2.pos #=\> -2

e$B!{e(B pos e$B$KI{:nMQ$,$"$ke(B

f1 = File.new(“foo.txt”)  
f2 = File.new(“foo.txt”)  
f2.gets  
f1.reopen(f2)  
f2.gets  
p f1.pos #=\> 6  
p f2.pos #=\> 4  
p f1.pos #=\> 4
