您的位置:首页 > 其它

ifstream ofstream 的初始化使用

2017-11-13 02:21 302 查看
这两个一个控制了信息往程序里输入,另一个控制了从程序里往外界输出信息

引用包 : #include

类实现 : ifstream instream;

ofstream outstream; 完成实现以后的instream 相当于一个信息导入器,利用信息导入器完成信息往程序里的导入

(理论是这么说,但是实际操作的时候会遇到很多问题)

主程序里实现的 instream对象 是不能拿到支线函数里使用的

instream 往往伴随着 支线程序 因为instream 会存在读取不出来的问题,因此往往需要一个 while + !instream.fail() 来配合使用

所以在这种情况下 , instream的实现需要在支线程序里完成,同样的

instream.open (“文件“) -> 链接文件

instream.get (ch) -> 从文件中读取字符

这样的操作也是在支线程序里一并完成了 其他内容加工的操作也一并完成

最后直接返回给main函数 读取到的内容/ 甚至是对内容加以操作的内容

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++;


解决方案:

先用 instream >> in;

再执行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.心态不能爆炸,做不出来就慢慢做,一个毛病一个毛病的找,做的快不是做的好,想要得高分还是要做的好
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: