c++ 之输入输出流(一) 真理何在?
环境: RHEL 5.X g++
1.首先,看程序
vim 8.c
#include <fstream>
#include <iostream>
#include <cstdlib>
using namespace std;
int main ()
{
ifstream inf;
inf.open("output.txt");
if (!inf)
{
cerr<<"打开文件失败!";
}
char line[100];
while (!inf.eof())
{
inf.getline(line,10);
cout<<line<<endl;
}
inf.close();
return 0;
}
保存 (vim 命令模式下 输入 ZZ)
2.其次,在当前目录下新建 output.txt
vim output.txt 并输入
1 9999 999999
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
保存 (在vi 命令模式下输入ZZ)
3.增加权限属性
chmod 777 output.txt
4.运行程序
g++ 8.c -o 8
./8
结果显示什么也没有。为了看清楚。输出重定向到a.out
./8 > a.out
5.查看 a.out
1 9999
这个可以理解,输出十个字符嘛。包括空格。但是
再看文件大小
ls -lh a.out
-rw-r--r-- 1 root root 215K 07-27 19:11 a.out
这就费解了。a.out的大小怎么这么大呢?215K 。按理说应该只有一行内容啊。
可是现在我都不知道有多少行了。除了第一行之外,其他都是用空格填充了。
谁知道可以解释一下吗?谢谢。了。
_Myt& __CLR_OR_THIS_CALL getline(_Elem *_Str,
streamsize _Count, _Elem _Delim)
{ // get up to _Count characters into NTCS, discard _Delim
_DEBUG_POINTER(_Str);
ios_base::iostate _State = ios_base::goodbit;
_Chcount = 0;
const sentry _Ok(*this, true);
if (_Ok && 0 < _Count)
{ // state okay, use facet to extract
int_type _Metadelim = _Traits::to_int_type(_Delim);
_TRY_IO_BEGIN
int_type _Meta = _Myios::rdbuf()->sgetc();
for (; ; _Meta = _Myios::rdbuf()->snextc())
if (_Traits::eq_int_type(_Traits::eof(), _Meta))
{ // end of file, quit
_State |= ios_base::eofbit;
break;
}
else if (_Meta == _Metadelim)
{ // got a delimiter, discard it and quit
++_Chcount;
_Myios::rdbuf()->sbumpc();
break;
}
else if (--_Count <= 0)
{ // buffer full, quit
_State |= ios_base::failbit;
break;
}
else
{ // got a character, add it to string
++_Chcount;
*_Str++ = _Traits::to_char_type(_Meta);
}
_CATCH_IO_END
}
*_Str = _Elem(); // add terminating null character
_Myios::setstate(_Chcount == 0 ? _State | ios_base::failbit : _State);
return (*this);
}
你读到一个大于10个字符的行时,由逻辑
else if (--_Count <= 0)
{ // buffer full, quit
_State |= ios_base::failbit;
break;
}
会将文件的_State置为ios_base::failbit,从而_Ok变成false
而后再继续getline时,_Ok将会一直为false,而getline会一直返回空串,在while中陷入死循环。内存被耗尽。
解决方法:
将getline 的参数 加大 ,如我改成 inf.getline(line,100) .这样只要output.txt文本内容中每一行,字符个数小于100就OK。
另外,
http://www.cnblogs.com/chenrj/archive/2009/05/31/1492963.html
提供了一种方法,我测试貌似不成功。大家不妨试试。得出结果的说一声啊。
参考:
http://www.cnblogs.com/chenrj/archive/2009/05/31/1492963.html
声明:本文档可以随意更改,但必须署名原作者
作者:凤凰舞者 qq:578989855