bin_file.h.xml 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. <chapter xml:id="bin_file.h">
  2. <title><tt>__vic/bin_file.h</tt></title>
  3. <chapter xml:id="bin_file">
  4. <title><tt>bin_file</tt></title>
  5. <code-block lang="C++"><![CDATA[
  6. class bin_file : private non_copyable
  7. {
  8. public:
  9. enum in_t { in };
  10. enum out_t { out };
  11. enum append_t { append };
  12. bin_file();
  13. bin_file(const char *fname, in_t);
  14. bin_file(const char *fname, out_t);
  15. bin_file(const char *fname, append_t);
  16. ~bin_file();
  17. // BEGIN C++11
  18. bin_file(bin_file &&o) noexcept;
  19. bin_file &operator=(bin_file &&o) noexcept;
  20. // END C++11
  21. bool open_in(const char *fname);
  22. bool open_out(const char *fname);
  23. bool open_append(const char *fname);
  24. size_t read_max(void *buf, size_t n);
  25. size_t read_some(void *buf, size_t n);
  26. void write_all(const void *buf, size_t n);
  27. bool is_open() const;
  28. void close();
  29. bool close_nt() noexcept;
  30. void swap(bin_file &o) noexcept;
  31. [[noreturn]] void throw_last_error(const char *msg);
  32. void throw_if_closed(const char *msg);
  33. };
  34. ]]></code-block>
  35. <p>Небуферизированный двоичный файл. Независимая от ОС обёртка низкоуровневого
  36. системного API.</p>
  37. <p>Доступны следующие режимы открытия:</p>
  38. <list style="bulleted">
  39. <item><tt>in</tt> - открыть существующий файл для чтения;</item>
  40. <item><tt>out</tt> - создать новый файл для записи, перетереть старый,
  41. если уже существует;</item>
  42. <item><tt>append</tt> - открыть существующий файл для добавления (запись в
  43. конец файла), создать новый, если не существует.</item>
  44. </list>
  45. <section><title>Члены класса</title>
  46. <synopsis>
  47. <prototype>enum in_t { in }</prototype>
  48. <prototype>enum out_t { out }</prototype>
  49. <prototype>enum append_t { append }</prototype>
  50. <p>Тэги конструкторов.</p>
  51. </synopsis>
  52. <synopsis>
  53. <prototype>bin_file()</prototype>
  54. <postcondition><tt>is_open() == false()</tt></postcondition>
  55. </synopsis>
  56. <synopsis>
  57. <prototype>bin_file(const char *fname, in_t)</prototype>
  58. <prototype>bin_file(const char *fname, out_t)</prototype>
  59. <prototype>bin_file(const char *fname, append_t)</prototype>
  60. <p>Вызывают <tt>open_in(fname)</tt>, <tt>open_out(fname)</tt> или
  61. <tt>open_append(fname)</tt>, соответственно. <tt>is_open()</tt> или
  62. <tt>throw_if_closed()</tt> должен быть вызван после для проверки результата.</p>
  63. </synopsis>
  64. <synopsis>
  65. <prototype>~bin_file()</prototype>
  66. <p>Закрывает файл, если <tt>is_open() == true</tt>.</p>
  67. </synopsis>
  68. <synopsis>
  69. <prototype>bin_file(bin_file &amp;&amp;o) noexcept <sign>C++11</sign></prototype>
  70. <prototype>bin_file &amp;operator=(bin_file &amp;&amp;o) noexcept <sign>C++11</sign></prototype>
  71. <p>Операции перемещения для режима C++11.</p>
  72. </synopsis>
  73. <synopsis>
  74. <prototype>bool open_in(const char *fname)</prototype>
  75. <prototype>bool open_out(const char *fname)</prototype>
  76. <prototype>bool open_append(const char *fname)</prototype>
  77. <p>Открыть файл для чтения, записи или добавления, соответственно. Возвращает
  78. <tt>is_open()</tt>.</p>
  79. <precondition><tt>is_open() == false</tt></precondition>
  80. </synopsis>
  81. <synopsis>
  82. <prototype>bool is_open() const</prototype>
  83. <p>Возвращает <tt>true</tt> если файл открыт.</p>
  84. </synopsis>
  85. <synopsis>
  86. <prototype>size_t read_max(void *buf, size_t n)</prototype>
  87. <p>Пытается прочитать <tt>n</tt> байтов в указанный буфер. Возвращает количество
  88. байтов, которое удалось прочитать. Возвращённое значение может быть меньше
  89. запрошенного только в случае, если достигнут конец файла. При ошибках бросает
  90. исключения.</p>
  91. <precondition><tt>is_open() == true</tt></precondition>
  92. </synopsis>
  93. <synopsis>
  94. <prototype>size_t read_some(void *buf, size_t n)</prototype>
  95. <p>Читает не более <tt>n</tt> байтов в указанный буфер. Возвращает количество
  96. прочитанных байтов или <tt>0</tt> при достижении конца файлов. Функция
  97. сразу возвращает управление, как только прочитан блок байтов любого размера.
  98. При ошибках бросает исключения.</p>
  99. <precondition><tt>is_open() == true</tt></precondition>
  100. </synopsis>
  101. <synopsis>
  102. <prototype>void write_all(const void *buf, size_t n)</prototype>
  103. <p>Записывает весь переданный буфер в файл. При ошибках бросает исключения.</p>
  104. <precondition><tt>is_open() == true</tt></precondition>
  105. </synopsis>
  106. <synopsis>
  107. <prototype>void close()</prototype>
  108. <p>Закрывает открытый файл. При ошибках бросает исключения.</p>
  109. <precondition><tt>is_open() == true</tt></precondition>
  110. <postcondition><tt>is_open() == false</tt></postcondition>
  111. </synopsis>
  112. <synopsis>
  113. <prototype>bool close_nt() noexcept</prototype>
  114. <p>Аналог <tt>close()</tt>, но никогда не бросает исключений. Вместо этого
  115. возвращает <tt>false</tt> при ошибках.</p>
  116. </synopsis>
  117. <synopsis>
  118. <prototype>void swap(bin_file &amp;o) noexcept</prototype>
  119. <p>Обменивается значением с <tt>o</tt>.</p>
  120. </synopsis>
  121. <synopsis>
  122. <prototype>[[noreturn]] void throw_last_error(const char *msg)</prototype>
  123. <p>Бросает исключение с описанием последней ошибки, если оно доступно. В любом
  124. случае <tt>what()</tt> будет содержать <tt>msg</tt> в виде подстроки.</p>
  125. </synopsis>
  126. <synopsis>
  127. <prototype>void throw_if_closed(const char *msg)</prototype>
  128. <p>Вызывает <tt>throw_last_error(msg)</tt>, если <tt>!is_open()</tt>.</p>
  129. </synopsis>
  130. </section>
  131. <section><title>Пример</title>
  132. <code-block lang="C++"><![CDATA[
  133. // Copy file
  134. __vic::bin_file in("file", __vic::bin_file::in);
  135. in.throw_if_closed("Cannot open file")
  136. __vic::bin_file out("file.copy", __vic::bin_file::out);
  137. out.throw_if_closed("Cannot create file")
  138. char buf[512];
  139. while(size_t n = in.read_some(buf, sizeof buf))
  140. out.write_all(buf, n);
  141. out.close();
  142. // in will be closed by destructor
  143. ]]></code-block>
  144. </section>
  145. </chapter>
  146. </chapter>