<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>stl &#8211; 扫地老僧的Blog</title>
	<atom:link href="https://doyj.com/tag/stl/feed/" rel="self" type="application/rss+xml" />
	<link>https://doyj.com</link>
	<description>Laputa - 远方地平线，闪耀着光芒</description>
	<lastBuildDate>Thu, 12 Oct 2006 04:23:11 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7.2</generator>
	<item>
		<title>在linux下一个有趣的STL文件IO问题</title>
		<link>https://doyj.com/2006/10/12/</link>
					<comments>https://doyj.com/2006/10/12/#comments</comments>
		
		<dc:creator><![CDATA[oldmonk]]></dc:creator>
		<pubDate>Wed, 11 Oct 2006 17:39:10 +0000</pubDate>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[io]]></category>
		<category><![CDATA[stl]]></category>
		<guid isPermaLink="false">http://www.doyj.com/2006/10/12/</guid>

					<description><![CDATA[在linux下读一个巨大的日志文件, 2.4G 用正文文件的方式打开, 一行一行的读 char achbuf[ &#8230; <a href="https://doyj.com/2006/10/12/" class="more-link">继续阅读<span class="screen-reader-text">在linux下一个有趣的STL文... ]]></description>
										<content:encoded><![CDATA[<p>在linux下读一个巨大的日志文件, 2.4G</p>
<p>用正文文件的方式打开, 一行一行的读</p>
<blockquote>
<pre><span style="color: #0000ff">char</span> achbuf[ 4096 ] ;

ifstream ifile( "<span style="color: #8b0000">/cygdrive/h/logs/zz/ex051117.log</span>" ) ;

<span style="color: #0000ff">if</span> ( !ifile ) {

cout &lt;&lt; "<span style="color: #8b0000">error in opening</span>" &lt;&lt; endl ;
<span style="color: #0000ff">return</span> -1 ;
}

<span style="color: #0000ff">int</span> i ;

<span style="color: #0000ff">for</span>( i = 0 ; !ifile.eof() ; i++ )
{
ifile.getline( achbuf , <span style="color: #0000ff">sizeof</span>( achbuf ) - 1 ) ;
}</pre>
</blockquote>
<pre>这个过程用了51秒</pre>
<p>2.4G的文件用51秒, 47M每秒, 已经接近硬盘的最高速度了.</p>
<p>当时想做个尝试, 看看用二进制方式打开一次读入16M能否会更快.</p>
<blockquote>
<pre><span style="color: #0000ff">char</span> achbuf[ 4096 * 4096 ] ;
ifstream ifile( "<span style="color: #8b0000">file.log</span>" , ios::in | ios::binary ) ;

<span style="color: #0000ff">if</span> ( !ifile ) {

cout &lt;&lt; "<span style="color: #8b0000">error in opening</span>" &lt;&lt; endl ;
<span style="color: #0000ff">return</span> -1 ;
}

<span style="color: #0000ff">int</span> i ;

<span style="color: #0000ff">for</span>( i = 0 ; !ifile.eof() ; i++ )
{
ifile.read( achbuf , <span style="color: #0000ff">sizeof</span>( achbuf ) ) ;
}</pre>
</blockquote>
<pre>这个过程竟然用了96秒!!!!!!!!!!</pre>
<pre>到论坛请教了一下, co给出一个链接: <a target="_blank" href="http://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/845beed6e4382f83/a0e82948def301fb">Fast read of binary files that alternate type</a></pre>
<pre>试了试co推荐的文章里说的方法, 加了 ifile.imbue( std::locale::classic());, 结果为88秒, 有提高.</pre>
<pre>改用下面的代码读是54秒, 和第一个速度相近了</pre>
<blockquote>
<pre>FILE *pfile ;

pfile = fopen( "<span style="color: #8b0000">file.log</span>" , "<span style="color: #8b0000">rbS</span>" ) ;

<span style="color: #0000ff">if</span> ( pfile == NULL ) {

cout &lt;&lt; "<span style="color: #8b0000">error in opening</span>" &lt;&lt; endl ;
<span style="color: #0000ff">return</span> -1 ;
}

<span style="color: #0000ff">int</span> i ;

<span style="color: #0000ff">for</span>( i = 0 ; !feof( pfile ) ; i++ )
{
fread( achbuf, 1 , <span style="color: #0000ff">sizeof</span>( achbuf ) , pfile ) ; <span style="color: #008000">//16M</span>
}

fclose( pfile ) ;</pre>
</blockquote>
<pre>刚开始学习stl,不太清楚stl文件io实现的内部机制, 不清楚为什么二进制和正文文件的读入速度差这么多.</pre>
<pre>有知道的请不吝赐教. 有能答疑解惑者,赠烤鸭一只<img decoding="async" alt="smile_tongue" src="http://spaces.live.com/rte/emoticons/smile_tongue.gif" /></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://doyj.com/2006/10/12/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
	</channel>
</rss>
