EOF рдПрдХ рдкреНрд░рддреАрдХ рдирд╣реАрдВ рд╣реИ

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореИрдВрдиреЗ "рдХрдВрдкреНрдпреВрдЯрд░ рд╕рд┐рд╕реНрдЯрдо: рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ" рдкреБрд╕реНрддрдХ рдкрдврд╝реАред рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рдирдЬрд╝рд░ред тАЭ рд╡рд╣рд╛рдВ, рдпреВрдирд┐рдХреНрд╕ I / O рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЕрдзреНрдпрд╛рдп рдореЗрдВ, рд▓реЗрдЦрдХреЛрдВ рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдЪрд░рд┐рддреНрд░ рдирд╣реАрдВ рд╣реИ EOFред рдпрджрд┐ рдЖрдк рдпреВрдирд┐рдХреНрд╕ / рд▓рд┐рдирдХреНрд╕ I / O рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝рддреЗ рд╣реИрдВ, рдпрд╛ рдЗрд╕рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдЖрдкрдиреЗ C рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрд╛ рд╣реИ рдЬреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХрдерди рд╕рдВрднрд╡рддрдГ рдЖрдкрдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд▓рдЧреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдЖрдЗрдП рдкреБрд╕реНрддрдХ рдореЗрдВ рдореБрдЭреЗ рдЬреЛ рдХреБрдЫ рдорд┐рд▓рд╛ рдЙрд╕рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЛ рдХрдердиреЛрдВ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:





  1. EOF - рдпрд╣ рдХреЛрдИ рдкреНрд░рддреАрдХ рдирд╣реАрдВ рд╣реИред
  2. рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдЕрдВрдд рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдг рдирд╣реАрдВ рд╣реИред

рдпрд╣ рдХреНрдпрд╛ рд╣реИ 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"рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд▓реИрдВрдЧреНрд╡реЗрдЬ" рдкреБрд╕реНрддрдХ рдХрд╛ рдПрдХ рд╕рдВрд╢реЛрдзрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИред

/* mcat.c */
#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 рдореЗрдВ, рдЖрдк рдкрдврд╝реА рдЧрдИ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ () рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЖрдП:

// mcat.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// 1-byte buffer
    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ред рд▓реЗрдХрд┐рди, рдЬрдм, рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдкрд░, рдХреБрдЫ рдФрд░ рдкрдврд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдЕрдВрддрд┐рдо рд╕реНрдЯреНрд░реАрдо рдИрд╡реЗрдВрдЯ рдХреЛ рдЙрдард╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред

/* mcat.js */
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); /* chunk is one byte */
  }
});

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 рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ:

/* 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 рдЖрдорддреМрд░ рдкрд░ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рдПрдХ "рд╡рд░реНрдг" EOFASCII рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдпрд╛ рдпреВрдирд┐рдХреЛрдб рдореЗрдВ рдирд╣реАрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВ! рдХреНрдпрд╛ рдЖрдк рдХрдВрдкреНрдпреВрдЯрд░ рдХреА рджреБрдирд┐рдпрд╛ рд╕реЗ рдХрд┐рд╕реА рднреА рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рд╡реНрдпрд╛рдкрдХ рднреНрд░рд╛рдВрддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ?


All Articles