Advertisement
Guest User

Untitled

a guest
Oct 19th, 2019
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.35 KB | None | 0 0
  1. #include <fcntl.h>
  2. #include <iostream>
  3. #include <unistd.h>
  4.  
  5. bool IsSpace(char c) {
  6.     return c == ' ' || c == '\t' || c == '\r' || c == '\n' || c == '\v' || c == '\f';
  7. }
  8.  
  9. int main(int argc, const char* argv[]) {
  10.     if (argc < 2) {
  11.         return 1;
  12.     }
  13.  
  14.     std::ios::sync_with_stdio(false);
  15.  
  16.     size_t num_chars = 0;
  17.     size_t num_words = 0;
  18.     size_t num_lines = 0;
  19.  
  20.     bool prev_space = true;
  21.     bool prev_newline = true;
  22.  
  23.     int fd = open(argv[1], O_RDONLY);
  24.     if (fd == -1) {
  25.         return 1;
  26.     }
  27.  
  28.     char buffer[4 << 10];
  29.     ssize_t size = 4 << 10;
  30.  
  31.     while (size) {
  32.         size = read(fd, buffer, 4 << 10);
  33.         if (size == -1) {
  34.             return 1;
  35.         }
  36.  
  37.         for (const char* it = buffer; it < buffer + size; ++it) {
  38.             char c = *it;
  39.  
  40.             ++num_chars;
  41.  
  42.             if (IsSpace(c)) {
  43.                 prev_space = true;
  44.             } else {
  45.                 num_words += prev_space;
  46.                 prev_space = false;
  47.             }
  48.  
  49.             if (c == '\n') {
  50.                 prev_newline = true;
  51.             } else {
  52.                 num_lines += prev_newline;
  53.                 prev_newline = false;
  54.             }
  55.         }
  56.     }
  57.  
  58.     close(fd);
  59.  
  60.     std::cout
  61.         << num_lines << ' ' << num_words << ' ' << num_chars << ' '
  62.         << argv[1] << std::endl;
  63. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement