ifstream ofstream 的初始化使用

来源:互联网 发布:行知教育石家庄地点 编辑:程序博客网 时间:2024/05/24 15:42

这两个一个控制了信息往程序里输入,另一个控制了从程序里往外界输出信息
引用包 : #include
类实现 : ifstream instream;
ofstream outstream; 完成实现以后的instream 相当于一个信息导入器,利用信息导入器完成信息往程序里的导入
(理论是这么说,但是实际操作的时候会遇到很多问题)

  1. 主程序里实现的 instream对象 是不能拿到支线函数里使用的
    instream 往往伴随着 支线程序 因为instream 会存在读取不出来的问题,因此往往需要一个 while + !instream.fail() 来配合使用
    所以在这种情况下 , instream的实现需要在支线程序里完成,同样的
    instream.open (“文件“) -> 链接文件
    instream.get (ch) -> 从文件中读取字符
    这样的操作也是在支线程序里一并完成了 其他内容加工的操作也一并完成
    最后直接返回给main函数 读取到的内容/ 甚至是对内容加以操作的内容

  2. instream与outstream的另类读取方式
    outstream的另类输出方式 outstream << 内容1 << 空格 << 内容2
    实际得到的结果: 与outstream相链接的文件里就会有 内容1+空格+内容2
    instream的另类输入方式 instream >> 变量1(类型1) >> 空格 >>变量2( 类型2 ) 其中 变量1与2分别被初始化成了类型1 与类型2
    实际得到的结果 : 系统就按照指令从文件中读取出一个符合类型1的赋值给变量1 再读取出一个符合类型2的赋值给变量2


3.一个发现:很多时候instream.eof() 不会发挥作用
具体主要表现在:明明已经是文章末尾,但是却不发挥作用,这样的特点导致while(!instream.eof()) 不会发挥作用
这样的原因是instream会默认将文章末尾的内容读取两遍针对这样的特点有两种解决方法

  • 利用while (instream>>ch) 当读取不进去的时候会自动终止,但是缺点也很明显,例如
    - 我们想从文件中读取数字 就 instream >> int 但是文件中如果有25x这样的存在 ,文章会读取一个25, 在下一轮的时候,到了x instream不会将x读给int ,条件不成立,while循环终止,我们就没机会读取25x这样一个错误了

  • 考虑到文章末尾的内容会被读取两次,因此如果此时读取到的的int等于上一次读取到的int 我们就认为已经是文章末尾,利用break退出循环 ,以下示范代码片段

    while (!instream.eof() ) {        instream >> in;        if (in == mappingboard[length-1]) break;        if (instream.fail()) leaving_programme(4);        mappingboard[length]=in;        if (this->mappingboard[length]>25 || this->mappingboard[length] <0) leaving_programme(3);        for (int a=0; a<length;a++){            if(mappingboard[length]==mappingboard[a]) leaving_programme(5);        }        length++;

解决方案:

  1. 先用 instream >> in;
  2. 再执行while(!instream.eof( )),此时方可奏效

具体来说:

问题已经解决了,面对所有的情况,以下的经验都适用:1.首先想要使用while(!instream.eof()) 必须要先在之前尝试使用一次instream>>in   即使是instream.putback都可以,但是至少要使用一次,然后eof才会奏效2.其次不能把instream >>in放在while循环的最后面,因为如果放在最后面,读取完这一次,然  后instream就指向了文章末尾,自然while条件就不成立了,因此最后一个数字就不会被操作3.不要总是想着为什么针对有的文件成立有的文件不成立,不成立自然是因为文件格式有问题,  如果你在文章末尾加上了回车号,以上的判断条件都是不成立的,自然会失败4.putback行为针对char字符是奏效的,但是针对int类型,再执行putback就是无效的5.心态不能爆炸,做不出来就慢慢做,一个毛病一个毛病的找,做的快不是做的好,想要得高分还是要做的好