109 lines
14 KiB
HTML
109 lines
14 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
|
|
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>std::FILE</title>
|
|
<link rel="stylesheet" href="ext.css" />
|
|
<link rel="stylesheet" href="site_modules.css" />
|
|
</head>
|
|
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-cpp_io_c_FILE skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading"><span style="font-size:0.7em; line-height:130%">std::</span>FILE</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="cpp.html">cpp</a>‎ | <a href="cpp-io.html">io</a>‎ | <a href="cpp-io-c.html">c</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dsc-header">
|
|
<td>
|
|
<div>定义于头文件 <code><a href="cpp-header-cstdio.html"><cstdio></a></code></div>
|
|
</td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw1">typedef</span> <span class="coMULTI">/* unspecified */</span> FILE<span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>每个 <code>std::FILE</code> 对象代表一个 C 流。</p>
|
|
<p>C 标准(为 C++ 标准所引用)不指定 <code>std::FILE</code> 是否为完整对象类型。当可能复制合法的 <code>std::FILE</code> 时,以指向这种副本的指针为 I/O 函数的参数导致未指定行为。换言之 <code>std::FILE</code> 可能在语义上不可复制。</p>
|
|
<p>I/O 流能用于无格式和有格式的输入及输出。另外,处理输入输出的函数亦能为本地环境敏感,以按需进行宽/多字节转换。</p>
|
|
<h3><span class="mw-headline" id=".E6.B5.81.E7.8A.B6.E6.80.81">流状态</span></h3>
|
|
<p>在系统指定的需要访问设备的信息(<i>例如</i> POSIX 文件描述符)外,每个 <code>std::FILE</code> 对象直接或间接保有下列信息:</p>
|
|
<ol>
|
|
<li>字符宽度:未设置、窄或宽。</li>
|
|
<li>多字节与宽字符间转换的分析状态( <span class="t-lc"><a href="cpp-string-multibyte-mbstate_t.html">std::mbstate_t</a></span> 类型对象)</li>
|
|
<li>缓冲状态:无缓冲、行缓冲、全缓冲。</li>
|
|
<li>缓冲区,可为外部的用户提供缓冲区所替换。</li>
|
|
<li>I/O 模式:输入、输出或更新(兼具输入与输出)。</li>
|
|
<li>二进制/文本模式指示器。</li>
|
|
<li>文件尾指示器。</li>
|
|
<li>错误状态指示器。</li>
|
|
<li>文件位置指示器,可作为 <span class="t-lc"><a href="cpp-io-c.html">std::fpos_t</a></span> 类型对象访问,对于宽流包含剖析状态。</li>
|
|
<li><span class="t-mark-rev t-since-cxx17">(C++17)</span>在多个线程读、写、寻位或查询流时避免数据竞争的再入锁。</li>
|
|
</ol>
|
|
<h4><span class="mw-headline" id=".E7.AA.84.E4.B8.8E.E5.AE.BD.E9.9D.A2.E5.90.91">窄与宽面向</span></h4>
|
|
<p>新打开的流无面向。首次到 <span class="t-lc">std::fwide</span> 的调用或 I/O 函数建立面向:宽 I/O 函数令流为宽面向,窄 I/O 函数令流为窄面向。一旦设置,则面向只能以 <span class="t-lc"><a href="cpp-io-c-freopen.html">std::freopen</a></span> 更改。不能在宽面向流上调用窄 I/O 函数,不能在窄面向流上调用宽 I/O 函数。宽 I/O 函数在宽与多字节字符间,如同通过以流所描述的转换状态调用 <span class="t-lc"><a href="cpp-string-multibyte-mbrtowc.html">std::mbrtowc</a></span> 或 <span class="t-lc"><a href="cpp-string-multibyte-wcrtomb.html">std::wcrtomb</a></span> 转换。不同于程序中合法的多字节字符串,文件中的多字节字符可以含有嵌入的空字符且不必以初始迁移状态开始或结束。</p>
|
|
<h4><span class="mw-headline" id=".E4.BA.8C.E8.BF.9B.E5.88.B6.E4.B8.8E.E6.96.87.E6.9C.AC.E6.A8.A1.E5.BC.8F">二进制与文本模式</span></h4>
|
|
<p><i>文本流</i>是能组合成行(零或更多字符加上终止的 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="st0">'<span class="es1">\n</span>'</span></span></span> )的有序字符序列;行能分解成零或多个字符加一个终止的 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="st0">'<span class="es1">\n</span>'</span></span></span> (“换行”)字符。最后一行是否要求终止的 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="st0">'<span class="es1">\n</span>'</span></span></span> 是实现定义的。另外,可能必须在输入与输出时添加、切换或删除字符,以符合 OS 中的表示文本(尤其是 Windows OS 上的 C 流在输出时将 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="st0">'<span class="es1">\n</span>'</span></span></span> 转换为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="st0">'<span class="es1">\r</span><span class="es1">\n</span>'</span></span></span> ,输入时将 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="st0">'<span class="es1">\r</span><span class="es1">\n</span>'</span></span></span> 转换为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="st0">'<span class="es1">\n</span>'</span></span></span> )。</p>
|
|
<p>仅若下列条件全为真,从文本流读取的数据才保证与先前写出到该文本流者比较相等:</p>
|
|
<ul>
|
|
<li>数据由打印字符和/或控制字符 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="st0">'<span class="es1">\t</span>'</span></span></span> 及 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="st0">'<span class="es1">\n</span>'</span></span></span> 组成(尤其是 Windows OS 上,字符 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="st0">'<span class="es5">\0</span>x1A'</span></span></span> 终止输入)。</li>
|
|
<li>无立即为空格符所前驱的 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="st0">'<span class="es1">\n</span>'</span></span></span> 字符(当这种输出随后作为输入读入时,这种空格字符可能消失)。</li>
|
|
<li>末字符是 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="st0">'<span class="es1">\n</span>'</span></span></span> 。</li>
|
|
</ul>
|
|
<p><i>二进制流</i>是能通透地记录内部数据的有序字符序列。从二进制流读取的数据始终与先前写出到该流者比较相等,除了允许实现后附不确定数量的空字符到流结尾。宽二进制流不必终止于初始迁移状态。</p>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">注解</span></h3>
|
|
<p>POSIX 显式要求在流的面向变成宽时,将当前安装的 C 本地环境的 <code>LC_CTYPE</code> 刻面存储于 <code>std::FILE</code> 对象中; POSIX 要求将此 <code>LC_CTYPE</code> 刻面用于此流上的所有将来 I/O 直至面向被更改,无关乎任何到 <span class="t-lc"><a href="cpp-locale-setlocale.html">std::setlocale</a></span> 的后继调用。</p>
|
|
<p>有意令文本的每行均由实质上人类可读的数据组成。 POSIX 实现不辨别文本与二进制流(无 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="st0">'<span class="es1">\n</span>'</span></span></span> 或任何其他字符的特殊映射)。</p>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-io-basic_streambuf.html"><span class="t-lines"><span>basic_streambuf</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>抽象原生设备<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-io-basic_filebuf.html"><span class="t-lines"><span>basic_filebuf</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>抽象原生文件设备<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-io-c-std_streams.html"><span class="t-lines"><span>stdin</span><span>stdout</span><span>stderr</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>与输入流关联到 <span class="t-c"><span class="mw-geshi cpp source-cpp">FILE<span class="sy2">*</span></span></span> 类型表达式<br />
|
|
与输出流关联的 <span class="t-c"><span class="mw-geshi cpp source-cpp">FILE<span class="sy2">*</span></span></span> 类型表达式<br />
|
|
与错误输出流关联的 <span class="t-c"><span class="mw-geshi cpp source-cpp">FILE<span class="sy2">*</span></span></span> 类型表达式<br />
|
|
<span class="t-mark">(宏常量)</span></td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|