c++ 输入输出流 真理何在? 真理已求得。

 


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 。按理说应该只有一行内容啊。
可是现在我都不知道有多少行了。除了第一行之外,其他都是用空格填充了。
谁知道可以解释一下吗?谢谢。了。
上面是问题,下面解释:
原因是getline函数

_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://topic.csdn.net/u/20100727/21/25aed228-8d56-4039-a6ad-92cf0db12f71.html?seed=1049743516&r=67302332#r_67302332

 

http://www.cnblogs.com/chenrj/archive/2009/05/31/1492963.html

声明:本文档可以随意更改,但必须署名原作者

                    

作者:凤凰舞者 qq:578989855

 


您想拥有和网易免费邮箱一样强大的软件吗?

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值