рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореИрдВрдиреЗ "рдХрдВрдкреНрдпреВрдЯрд░ рд╕рд┐рд╕реНрдЯрдо: рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ" рдкреБрд╕реНрддрдХ рдкрдврд╝реАред рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рдирдЬрд╝рд░ред тАЭ рд╡рд╣рд╛рдВ, рдпреВрдирд┐рдХреНрд╕ I / O рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЕрдзреНрдпрд╛рдп рдореЗрдВ, рд▓реЗрдЦрдХреЛрдВ рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдЪрд░рд┐рддреНрд░ рдирд╣реАрдВ рд╣реИ EOF
ред рдпрджрд┐ рдЖрдк рдпреВрдирд┐рдХреНрд╕ / рд▓рд┐рдирдХреНрд╕ I / O рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝рддреЗ рд╣реИрдВ, рдпрд╛ рдЗрд╕рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдЖрдкрдиреЗ C рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрд╛ рд╣реИ рдЬреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХрдерди рд╕рдВрднрд╡рддрдГ рдЖрдкрдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд▓рдЧреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдЖрдЗрдП рдкреБрд╕реНрддрдХ рдореЗрдВ рдореБрдЭреЗ рдЬреЛ рдХреБрдЫ рдорд┐рд▓рд╛ рдЙрд╕рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЛ рдХрдердиреЛрдВ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:
EOF
- рдпрд╣ рдХреЛрдИ рдкреНрд░рддреАрдХ рдирд╣реАрдВ рд╣реИред- рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдЕрдВрдд рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдг рдирд╣реАрдВ рд╣реИред
рдпрд╣ рдХреНрдпрд╛ рд╣реИ EOF
?EOF рдПрдХ рдкреНрд░рддреАрдХ рдирд╣реАрдВ рд╣реИ
рдХреЛрдИ рдпрд╣ рдХреНрдпреЛрдВ рдХрд╣рддрд╛ рдпрд╛ рд╕реЛрдЪрддрд╛ рд╣реИ рдХрд┐ EOF
рдпрд╣ рдПрдХ рдкреНрд░рддреАрдХ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рд╕реА рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдЖрдк рдРрд╕реЗ рдХреЛрдб рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ EOF
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдЬрд╛рдБрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ getchar()
рдФрд░ getc()
редрдпрд╣ рдЗрд╕ рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ: #include <stdio.h>
...
while ((c = getchar()) != EOF)
putchar(c);
рдпрд╛ рдРрд╕рд╛: FILE *fp;
int c;
...
while ((c = getc(fp)) != EOF)
putc(c, stdout);
рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрддрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ getchar()
рдпрд╛ getc()
, рдЖрдк рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рджреЛрдиреЛрдВ рдлрд╝рдВрдХреНрд╢рди рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдЕрдЧрд▓рд╛ рд╡рд░реНрдг рдкрдврд╝рддреЗ рд╣реИрдВред рд╢рд╛рдпрдж - рдпрд╣ рдареАрдХ рд╡рд╣реА рд╣реИ рдЬреЛ рдкреНрд░рдХреГрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧрд▓рдд рдзрд╛рд░рдгрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ EOF
ред рд▓реЗрдХрд┐рди рдпреЗ рд╕рд┐рд░реНрдл рдореЗрд░реА рдзрд╛рд░рдгрд╛рдПрдВ рд╣реИрдВред рдЖрдЗрдП рд╣рдо рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдкрд░ рд▓реМрдЯреЗрдВ рдХрд┐ EOF
- рдпрд╣ рдХреЛрдИ рдкреНрд░рддреАрдХ рдирд╣реАрдВ рд╣реИредрдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдПрдХ рдкреНрд░рддреАрдХ рдХреНрдпрд╛ рд╣реИ? рдПрдХ рдкреНрд░рддреАрдХ рдкрд╛рда рдХрд╛ рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рдШрдЯрдХ рд╣реИред "рдП", "рдП", "рдмреА", "рдмреА" - рдпреЗ рд╕рднреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рддреАрдХ рд╣реИрдВред рдПрдХ рд╡рд░реНрдг рдореЗрдВ рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдХреЛрдб рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдпреВрдирд┐рдХреЛрдб рдорд╛рдирдХ рдореЗрдВ рдПрдХ рдХреЛрдб рдмрд┐рдВрджреБ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реИрдЯрд┐рди рдЕрдХреНрд╖рд░ "рдП" рдореЗрдВ рджрд╢рдорд▓рд╡, рдХреЛрдб 65 рд╣реИред рдЗрд╕реЗ рдкрд╛рдпрдерди рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреА рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрд▓реНрджреА рд╕реЗ рдЬрд╛рдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:$python
>>> ord('A')
65
>>> chr(65)
'A'
рдпрд╛ рдЖрдк рдпреВрдирд┐рдХреНрд╕ / рд▓рд┐рдирдХреНрд╕ рдкрд░ ASCII рддрд╛рд▓рд┐рдХрд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:$ man ascii
рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗ рдХрд┐ рдХреМрди рд╕рд╛ рдХреЛрдб EOF
рд╕реА рдореЗрдВ рдЫреЛрдЯрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдХрд░ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдПрдПрдирдПрд╕рдЖрдИ рд╕реА рдореЗрдВ, рдПрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ EOF
рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ stdio.h
, рдпрд╣ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░ рдЗрд╕ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ -1
ред рдЖрдк рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрди рдХреЛрдб рд╕рд╣реЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ printeof.c
, рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:#include <stdio.h>
int main(int argc, char *argv[])
{
printf("EOF value on my system: %d\n", EOF);
return 0;
}
рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдВ:$ gcc -o printeof printeof.c
$ ./printeof
EOF value on my system: -1
рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИ, рдореИрдХ рдУрдПрд╕ рдФрд░ рдЙрдмрдВрдЯреВ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд░рд┐рдкреЛрд░реНрдЯ рдЬреЛ EOF
рдмрд░рд╛рдмрд░ рд╣реИ -1
ред рдХреНрдпрд╛ рдЗрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреЛрдИ рдЪрд░рд┐рддреНрд░ рд╣реИ? рдпрд╣рд╛рдВ, рдлрд┐рд░ рд╕реЗ, рдЖрдк ASCII рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╡рд░реНрдг рдХреЛрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдпреВрдирд┐рдХреЛрдб рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрддрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд░реНрдг рдХреЛрдб рдХрд┐рд╕ рд╕реАрдорд╛ рдореЗрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рдХрд╛рд░реНрдп рдХрд░реЗрдВрдЧреЗ: рд╣рдо рдкрд╛рдпрдерди рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЛ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ рдФрд░ chr()
рд╣рдореЗрдВ рдХреЛрдб рдХреЗ рдЕрдиреБрд░реВрдк рдкреНрд░рддреАрдХ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ -1
:$ python
>>> chr(-1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: chr() arg not in range(0x110000)
рдЬреИрд╕реА рдХрд┐ рдЙрдореНрдореАрдж рдереА, рдХреЛрдб рд╡рд╛рд▓рд╛ рдЪрд░рд┐рддреНрд░ -1
рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред рддреЛ, рдЕрдВрдд рдореЗрдВ, EOF
рдФрд░ рд╕рддреНрдп рдПрдХ рдкреНрд░рддреАрдХ рдирд╣реАрдВ рд╣реИред рдЕрдм рд╣рдо рд╡рд┐рдЪрд╛рд░рд╛рдзреАрди рджреВрд╕рд░реЗ рдХрдерди рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВредрдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдЕрдВрдд рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдг рдирд╣реАрдВ рд╣реИред
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ EOF
- рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЪрд░рд┐рддреНрд░ рд╣реИ рдЬреЛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╡рд╛рдм рдЬрд╛рдирддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЖрдЗрдП рд╣рдорд╛рд░реА рдзрд╛рд░рдгрд╛ рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рджреЗрдЦреЗрдВредрдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкрд╛рда рдлрд╝рд╛рдЗрд▓, helloworld.txt рд▓реЗрдВ , рдФрд░ рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ xxd
:$ cat helloworld.txt
Hello world!
$ xxd helloworld.txt
00000000: 4865 6c6c 6f20 776f 726c 6421 0a Hello world!.
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрддрд┐рдо рд╡рд░реНрдг рдореЗрдВ рдПрдХ рдХреЛрдб рд╣реИ 0a
ред ASCII рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ, рдЖрдк рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреЛрдб рдПрдХ рд╡рд░реНрдг рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ nl
, рдЕрд░реНрдерд╛рдд рдПрдХ рдирдП рд╡рд░реНрдг рдкрд░ред рдЖрдк рдкрд╛рдпрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ:$ python
>>> chr(0x0a)
'\n'
рдЗрд╕рд▓рд┐рдПред EOF
- рдпрд╣ рдПрдХ рдкреНрд░рддреАрдХ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рдЕрдВрдд рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рддреАрдХ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдХреНрдпрд╛ рд╣реИ EOF
?рдПрдХ рдИрдУрдПрдл рдХреНрдпрд╛ рд╣реИ
EOF
(рдПрдВрдб-рдСрдл-рдлрд╝рд╛рдЗрд▓) рдПрдХ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рд╣реИ рдЬрд┐рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдлрд╝рд╛рдЗрд▓ рд░реАрдб рдСрдкрд░реЗрд╢рди рдЕрдкрдиреЗ рдЕрдВрдд рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИредрдЖрдЗрдП рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдХрд┐ EOF
рдЗрди рднрд╛рд╖рд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝рддреЗ рд╕рдордп рд╡рд┐рднрд┐рдиреНрди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд░рд╛рдЬреНрдп рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдХреИрд╕реЗ рд╕рдВрднрд╡ рд╣реИ ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╕рдВрд╕реНрдХрд░рдг рд▓рд┐рдЦреЗрдВрдЧреЗ cat
, рдЬрд┐рд╕реЗ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ mcat
ред рдпрд╣ ASCII рдЯреЗрдХреНрд╕реНрдЯ рдмрд╛рдЗрдЯ (рд╡рд░реНрдг) рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ EOF
ред рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦреЗрдВрдЧреЗ:- ANSI рд╕реА
- рдЕрдЬрдЧрд░ рей
- рдЬрд╛рдУ
- рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ (Node.js)
рдпрд╣рд╛рдБ рдирдореВрдирд╛ рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рднрдВрдбрд╛рд░ рд╣реИред рд╣рдо рдЙрдирдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВредANSI рд╕реА
рдЪрд▓реЛ рдЖрджрд░рдгреАрдп рд╕реА рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдкреНрд░рд╕реНрддреБрдд рдХрд╛рд░реНрдпрдХреНрд░рдо cat
"рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд▓реИрдВрдЧреНрд╡реЗрдЬ" рдкреБрд╕реНрддрдХ рдХрд╛ рдПрдХ рд╕рдВрд╢реЛрдзрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИред
#include <stdio.h>
int main(int argc, char *argv[])
{
FILE *fp;
int c;
if ((fp = fopen(*++argv, "r")) == NULL) {
printf("mcat: can't open %s\n", *argv);
return 1;
}
while ((c = getc(fp)) != EOF)
putc(c, stdout);
fclose(fp);
return 0;
}
рд╕рдВрдХрд▓рди:$ gcc -o mcat mcat.c
рдкреНрд░рдХреНрд╖реЗрдкрдг:$ ./mcat helloworld.txt
Hello world!
рдпрд╣рд╛рдБ рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВ:- рдкреНрд░реЛрдЧреНрд░рд╛рдо рдПрдХ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реЗ рдкрд╛рд╕ рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЦреЛрд▓рддрд╛ рд╣реИред
- рд▓реВрдк
while
рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдорд╛рдирдХ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдбреЗрдЯрд╛ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддрд╛ рд╣реИред рдбреЗрдЯрд╛ рдХреЛ рдмрд╛рдЗрдЯ рджреНрд╡рд╛рд░рд╛ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рддрдм рддрдХ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рддрдХ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЕрдВрдд рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ред - рдЬрдм рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ
EOF
, рддреЛ рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдЬрдЧрд░ рей
рдкрд╛рдпрдерди рдореЗрдВ, EOF
рдПрдПрдирдПрд╕рдЖрдИ рд╕реА рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдПрдХ рдХреЗ рд╕рдорд╛рди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рддрдВрддреНрд░ рдирд╣реАрдВ рд╣реИ , рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЪрд░рд┐рддреНрд░ рджреНрд╡рд╛рд░рд╛ рдлрд╝рд╛рдЗрд▓ рд╡рд░реНрдг рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд░рд╛рдЬреНрдп рдХреЛ рдкреНрд░рдХрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ EOF
рдпрджрд┐ рдЕрдЧрд▓реЗ рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрдг рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЪрд░ рдЦрд╛рд▓реА рд╣реИ:# mcat.py
import sys
with open(sys.argv[1]) as fin:
while True:
c = fin.read(1) # 1
if c == '': # EOF
break
print(c, end='')
рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЪрд▓рд╛рдПрдВ рдФрд░ рдЙрд╕ рдкрд░ рд▓реМрдЯреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:$ python mcat.py helloworld.txt
Hello world!
рдпрд╣рд╛рдБ Python 3.8+ рдореЗрдВ рд▓рд┐рдЦреЗ рдЙрд╕реА рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИред рдпрд╣рд╛рдВ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ : = (рдЗрд╕реЗ "рд╡рд╛рд▓рд░рд╕ рдСрдкрд░реЗрдЯрд░" рдпрд╛ "рд╡рд╛рд▓рд░рд╕ рдСрдкрд░реЗрдЯрд░" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ):# mcat38.py
import sys
with open(sys.argv[1]) as fin:
while (c := fin.read(1)) != '': # 1 EOF
print(c, end='')
рдпрд╣ рдХреЛрдб рдЪрд▓рд╛рдПрдБ:$ python3.8 mcat38.py helloworld.txt
Hello world!
рдЬрд╛рдУ
Go рдореЗрдВ, рдЖрдк рдкрдврд╝реА рдЧрдИ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ () рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЖрдП:
package main
import (
"fmt"
"os"
"io"
)
func main() {
file, err := os.Open(os.Args[1])
if err != nil {
fmt.Fprintf(os.Stderr, "mcat: %v\n", err)
os.Exit(1)
}
buffer := make([]byte, 1)
for {
bytesread, err := file.Read(buffer)
if err == io.EOF {
break
}
fmt.Print(string(buffer[:bytesread]))
}
file.Close()
}
рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдПрдБ:$ go run mcat.go helloworld.txt
Hello world!
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ (Node.js)
Node.js рдХреЗ рдкрд╛рд╕ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рддрдВрддреНрд░ рдирд╣реАрдВ рд╣реИ EOF
ред рд▓реЗрдХрд┐рди, рдЬрдм, рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдкрд░, рдХреБрдЫ рдФрд░ рдкрдврд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдЕрдВрддрд┐рдо рд╕реНрдЯреНрд░реАрдо рдИрд╡реЗрдВрдЯ рдХреЛ рдЙрдард╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред
const fs = require('fs');
const process = require('process');
const fileName = process.argv[2];
var readable = fs.createReadStream(fileName, {
encoding: 'utf8',
fd: null,
});
readable.on('readable', function() {
var chunk;
while ((chunk = readable.read(1)) !== null) {
process.stdout.write(chunk);
}
});
readable.on('end', () => {
console.log('\nEOF: There will be no more data.');
});
рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдПрдБ:$ node mcat.js helloworld.txt
Hello world!
EOF: There will be no more data.
рдирд┐рдореНрди рд╕реНрддрд░реАрдп рдкреНрд░рдгрд╛рд▓реА рддрдВрддреНрд░
рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп I / O рддрдВрддреНрд░ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ? рд▓рд┐рдирдХреНрд╕ рдкрд░, рдпреЗ рддрдВрддреНрд░ рдХрд░реНрдиреЗрд▓ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд░реАрдб () рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рдпрд╛ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ред рд╕реА рд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди (рдпрд╛ рдореИрдХреНрд░реЛ) getc()
, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ read()
рдФрд░ рд░рд┐рдЯрд░реНрди рдХрд░рддрд╛ рд╣реИ EOF
рдпрджрд┐ рдпрд╣ read()
рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, read()
рд░рд┐рдЯрд░реНрди 0
ред рдпрджрд┐ рдЖрдк рдЖрд░реЗрдЦ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рд╕рдм рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓рддреЗ рд╣реИрдВ:рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдкрд░ getc()
рдЖрдзрд╛рд░рд┐рдд рд╣реИ read()
редрд╣рдо рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рд▓рд┐рдЦреЗрдВрдЧреЗ cat
рдирд╛рдорд┐рдд syscat
рдХреЗрд╡рд▓ рдпреВрдирд┐рдХреНрд╕ рдкреНрд░рдгрд╛рд▓реА рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧред рд╣рдо рдРрд╕рд╛ рди рдХреЗрд╡рд▓ рдмреНрдпрд╛рдЬ рд╕реЗ рдХрд░реЗрдВрдЧреЗ, рдмрд▓реНрдХрд┐ рдЗрд╕рд▓рд┐рдП рднреА рдХрд┐ рдЗрд╕рд╕реЗ рд╣рдореЗрдВ рдХреБрдЫ рдлрд╛рдпрджрд╛ рд╣реЛрдЧрд╛редрдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо C рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int fd;
char c;
fd = open(argv[1], O_RDONLY, 0);
while (read(fd, &c, 1) != 0)
write(STDOUT_FILENO, &c, 1);
return 0;
}
рдЪрд▓рд╛рдУ:$ gcc -o syscat syscat.c
$ ./syscat helloworld.txt
Hello world!
рдпрд╣ рдХреЛрдб рдЗрд╕ рддрдереНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди read()
, рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ, рд░рд┐рдЯрд░реНрди рдХрд░рддрд╛ рд╣реИ 0
редрдпрд╣рд╛рдБ рдПрдХ рд╣реА рдХрд╛рд░реНрдпрдХреНрд░рдо рдкрд╛рдпрдерди 3 рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ:# syscat.py
import sys
import os
fd = os.open(sys.argv[1], os.O_RDONLY)
while True:
c = os.read(fd, 1)
if not c: # EOF
break
os.write(sys.stdout.fileno(), c)
рдЪрд▓рд╛рдУ:$ python syscat.py helloworld.txt
Hello world!
рдпрд╣рд╛рдБ рдПрдХ рд╣реА рдЪреАрдЬрд╝ рдкрд╛рдпрдерди 3.8+ рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рд╣реИ:# syscat38.py
import sys
import os
fd = os.open(sys.argv[1], os.O_RDONLY)
while c := os.read(fd, 1):
os.write(sys.stdout.fileno(), c)
рдЗрд╕ рдХреЛрдб рдХреЛ рднреА рдЪрд▓рд╛рдПрдВ:$ python3.8 syscat38.py helloworld.txt
Hello world!
рд╕рд╛рд░рд╛рдВрд╢
EOF
- рдпрд╣ рдХреЛрдИ рдкреНрд░рддреАрдХ рдирд╣реАрдВ рд╣реИред- рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдЕрдВрдд рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдг рдирд╣реАрдВ рд╣реИред
EOF
- рдпрд╣ рдХрд░реНрдиреЗрд▓ рджреНрд╡рд╛рд░рд╛ рд░рд┐рдкреЛрд░реНрдЯ рдХреА рдЧрдИ рд╕реНрдерд┐рддрд┐ рд╣реИ рдФрд░ рдЬрд┐рд╕реЗ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдбреЗрдЯрд╛ рд░реАрдбрд┐рдВрдЧ рдСрдкрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИред- рдПрдПрдирдПрд╕рдЖрдИ рд╕реА рдореЗрдВ
EOF
, рдпрд╣ рдлрд┐рд░ рд╕реЗ рдПрдХ рдЪрд░рд┐рддреНрд░ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдирд┐рд░рдВрддрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрддрд╛ stdio.h
рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдорд╛рди -1 рдЖрдорддреМрд░ рдкрд░ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред - рдПрдХ "рд╡рд░реНрдг"
EOF
ASCII рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдпрд╛ рдпреВрдирд┐рдХреЛрдб рдореЗрдВ рдирд╣реАрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВ! рдХреНрдпрд╛ рдЖрдк рдХрдВрдкреНрдпреВрдЯрд░ рдХреА рджреБрдирд┐рдпрд╛ рд╕реЗ рдХрд┐рд╕реА рднреА рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рд╡реНрдпрд╛рдкрдХ рднреНрд░рд╛рдВрддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ?