stdio_file.h.xml 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. <chapter xml:id="stdio_file.h">
  2. <title><tt>__vic/stdio_file.h</tt></title>
  3. <p>C++ обёртки для <tt>std::FILE</tt>.</p>
  4. <chapter xml:id="stdio_file">
  5. <title><tt>stdio_file</tt></title>
  6. <code-block lang="C++"><![CDATA[
  7. class stdio_file : private non_copyable
  8. {
  9. public:
  10. explicit stdio_file(std::FILE *fp = nullptr);
  11. stdio_file(const char *name, const char *mode);
  12. ~stdio_file();
  13. // BEGIN C++11
  14. stdio_file(stdio_file &&o) noexcept;
  15. stdio_file &operator=(stdio_file &&o) noexcept;
  16. // END C++11
  17. bool open(const char *name, const char *mode);
  18. bool is_open() const;
  19. void close();
  20. bool close_nt() noexcept;
  21. void swap(stdio_file &o) noexcept;
  22. std::FILE *detach_handle() noexcept;
  23. std::FILE *attach_handle(std::FILE *fp) noexcept;
  24. std::FILE *handle() const;
  25. operator std::FILE*() const;
  26. };
  27. ]]></code-block>
  28. <p>Тонкая RAII-обёртка для <tt>std::FILE *</tt>. Контролирует время жизни
  29. файла. Автоматический преобразователь типа позволяет использовать объекты
  30. данного типа в контекстах, требующих <tt>FILE *</tt>.</p>
  31. <note>Хоть деструктор объекта и закрывает незакрытый поток, но лучше
  32. использовать явный вызов <tt>close()</tt>. При закрытии потока также могут
  33. происходить ошибки, и <tt>close()</tt> проинформирует о них исключением.
  34. Деструктор же их просто проигнорирует, и они останутся незамечены приложением.
  35. </note>
  36. <section><title>Члены класса</title>
  37. <synopsis>
  38. <prototype>explicit stdio_file(std::FILE *fp = nullptr)</prototype>
  39. <p>Создаёт обёртку для уже имеющегося указателя потока.</p>
  40. <precondition><tt>fp</tt> указывает на открытый файл или <tt>nullptr</tt>.
  41. </precondition>
  42. </synopsis>
  43. <synopsis>
  44. <prototype>stdio_file(const char *name, const char *mode)</prototype>
  45. <p>Вызывает <tt>open(name, mode)</tt>. Необходимо проверить результат открытия
  46. последующим вызовом <tt>is_open()</tt>!</p>
  47. </synopsis>
  48. <synopsis>
  49. <prototype>~stdio_file()</prototype>
  50. <p>Вызывает <tt>std::fclose()</tt>, если <tt>is_open() == true</tt>.</p>
  51. </synopsis>
  52. <synopsis>
  53. <prototype>stdio_file(stdio_file &amp;&amp;o) noexcept <sign>C++11</sign></prototype>
  54. <prototype>stdio_file &amp;operator=(stdio_file &amp;&amp;o) noexcept <sign>C++11</sign></prototype>
  55. <p>Операции перемещения для режима C++11.</p>
  56. </synopsis>
  57. <synopsis>
  58. <prototype>bool open(const char *name, const char *mode)</prototype>
  59. <p>Вызывает <tt>std::fopen(name, mode)</tt>. Возвращает <tt>true</tt> в случае
  60. успеха.</p>
  61. <precondition><tt>is_open() == false</tt></precondition>
  62. </synopsis>
  63. <synopsis>
  64. <prototype>bool is_open() const</prototype>
  65. <p>Возвращает <tt>true</tt> если файл открыт.</p>
  66. </synopsis>
  67. <synopsis>
  68. <prototype>void close()</prototype>
  69. <p>Вызывает <tt>std::fclose()</tt>. Проверка на то, открыт ли файл, не
  70. производится! Если <tt>std::fclose()</tt> возвращает ошибку, то бросается
  71. исключение.</p>
  72. <precondition><tt>is_open() == true</tt></precondition>
  73. <postcondition><tt>is_open() == false</tt></postcondition>
  74. </synopsis>
  75. <synopsis>
  76. <prototype>bool close_nt() noexcept</prototype>
  77. <p>Аналог <tt>close()</tt>, но никогда не бросает исключений, а возвращает
  78. <tt>false</tt> в случае ошибок.</p>
  79. </synopsis>
  80. <synopsis>
  81. <prototype>void swap(stdio_file &amp;o) noexcept</prototype>
  82. <p>Обменивается значением с <tt>o</tt>.</p>
  83. </synopsis>
  84. <synopsis>
  85. <prototype>std::FILE *detach_handle() noexcept</prototype>
  86. <p>Освобождает файл из-под контроля объекта.</p>
  87. <postcondition><tt>is_open() == false</tt></postcondition>
  88. </synopsis>
  89. <synopsis>
  90. <prototype>std::FILE *attach_handle(std::FILE *fp) noexcept</prototype>
  91. <p>Помещает <tt>fp</tt> под контроль объекта и возвращает предыдущее хранимое
  92. значение.</p>
  93. <precondition><tt>fp</tt> – указатель на открытый файл или <tt>nullptr</tt>.
  94. </precondition>
  95. <postcondition><tt>handle() == fp</tt></postcondition>
  96. </synopsis>
  97. <synopsis>
  98. <prototype>std::FILE *handle() const</prototype>
  99. <p>Возвращает хранимое завёрнутое значение.</p>
  100. </synopsis>
  101. <synopsis>
  102. <prototype>operator std::FILE*() const</prototype>
  103. <p>Позволяет использовать объект как <tt>std::FILE *</tt>.</p>
  104. </synopsis>
  105. </section>
  106. <section><title>Пример</title>
  107. <code-block lang="C++">
  108. __vic::stdio_file file("file.txt", "w");
  109. if(!file.is_open()) throw __vic::exception("Cannot open file");
  110. std::fprintf(file, "Message");
  111. file.close();
  112. // fclose() также вызовется автоматически деструктором при исключениях
  113. </code-block>
  114. </section>
  115. </chapter>
  116. <chapter xml:id="read-FILE-char">
  117. <title><tt>read(std::FILE, char&amp;)</tt>,
  118. <tt>read(std::FILE, unsigned char&amp;)</tt></title>
  119. <code-block lang="C++"><![CDATA[
  120. bool read(std::FILE *fp, char &ch);
  121. bool read(std::FILE *fp, unsigned char &ch);
  122. ]]></code-block>
  123. <p>Пытается прочитать байт из потока C. Возвращает <tt>true</tt> в случае
  124. успеха, <tt>false</tt> при достижении конца файла или бросает исключение в
  125. случае ошибки.</p>
  126. </chapter>
  127. <chapter xml:id="write-FILE-char">
  128. <title><tt>write(std::FILE, char)</tt></title>
  129. <code-block lang="C++"><![CDATA[
  130. void write(std::FILE *fp, char ch);
  131. ]]></code-block>
  132. <p>Записывает байт в поток C. Бросает исключение в случае ошибки.</p>
  133. </chapter>
  134. <chapter xml:id="getline-FILE">
  135. <title><tt>getline(std::FILE)</tt></title>
  136. <code-block lang="C++"><![CDATA[
  137. bool getline(std::FILE *fp, std::string &str, char delim = '\n');
  138. ]]></code-block>
  139. <p>Аналог <tt>std::getline</tt> для потоков C. Возвращает <tt>false</tt>,
  140. если конец файла достигнут раньше, чем что-то было прочитано.</p>
  141. </chapter>
  142. </chapter>