设为首页收藏本站

新微赢技术网

 找回密码
 注册
搜索
热搜: 回贴
查看: 1672|回复: 9
打印 上一主题 下一主题

IO流与文件流的缓冲问题

[复制链接]
跳转到指定楼层
1#
发表于 2009-11-5 00:32:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//代码没多大意义,仅举个例子
#include<iostream.h>
#include<fstream.h>
#include<stdio.h>
#include<conio.h>
#include<process.h>
int main()
{ ///////////////////////以下可以略去不看////////////////////////////////////////
system("if exist C:\\测试文件夹 echo 已经存在测试文件夹,正在清空...");
system("if exist C:\\测试文件夹 del C:\\测试文件夹 /q");
system("if not exist C:\\测试文件夹 echo 不存在 \"C:\\测试文件夹 正在建立文件夹...\"");
system("if exist C:\\测试文件夹 rd C:\\测试文件夹");

if(!system("md C:\\测试文件夹"))
printf("测试文件夹建立成功!文件路径:C:\\测试文件夹\\test.bin \n");
//////////////////////////////////////////////////////////////////////////////
ofstream fileo("C:\\测试文件夹\\test.bin",ios::binary);
char input='\0'; //从此处改变 char buffer[2]={'\0','\0'}
printf("写入文件:>"); // printf("写入文件:>");
while(input!='\r') // while(buffer[0]!='\r')
{ input=getche(); // { input=getche();
fileo<<input; // buffer[1]=buffer[0];
} // buffer[0]=input;
// if(buffer[0]!='\b')
// fileo<<buffer[1];
// } //试图在文件里面过滤掉backspace符
printf("写入完成!\n");
fileo.close();
printf("文件关闭!\n");
ifstream filei("C:\\测试文件夹\\test.bin",ios::binary);
char info[100];
for(int j=0;j<100;j++)
info[j]='\0';
filei.read(info,99);
cout<<"读取完毕,输出:>"<<info<<endl; //改变代码后在“读取完毕,输出”后没有输出任何东西!!!
filei.close();
return 0;
}
直接的代码编译后能输出输入的字符
另一个问题:如果将printf函数用IO流的cin代替,结果会导致cout输出的顺序混乱
已经很多次碰到这个问题了,猜想是跟IO流与文件流的缓冲有关,但还是不清楚。
恳请那位大虾详细指教!
2#
发表于 2009-11-5 00:32:58 | 只看该作者
没有人能够说说自己的看法吗
回复 支持 反对

使用道具 举报

3#
发表于 2009-11-5 00:32:59 | 只看该作者
#include<iostream.h>
#include<fstream.h>
#include<stdio.h>
#include<conio.h>
#include<process.h>
int main()
{ ///////////////////////以下可以略去不看////////////////////////////////////////
system("if exist C:\\测试文件夹 echo 已经存在测试文件夹,正在清空...");
system("if exist C:\\测试文件夹 del C:\\测试文件夹 /q");
system("if not exist C:\\测试文件夹 echo 不存在 \"C:\\测试文件夹 正在建立文件夹...\"");
system("if exist C:\\测试文件夹 rd C:\\测试文件夹");

if(!system("md C:\\测试文件夹"))
printf("测试文件夹建立成功!文件路径:C:\\测试文件夹\\test.bin \n");
//////////////////////////////////////////////////////////////////////////////
ofstream fileo("C:\\测试文件夹\\test.bin",ios::binary);
char input='\0';
printf("写入文件:>");
while(input!='\r')
{
input=getche();
if(input!=' ')
fileo<<input;
} //试图在文件里面过滤掉backspace符
printf("写入完成!\n");
fileo.close();
printf("文件关闭!\n");
ifstream filei("C:\\测试文件夹\\test.bin",ios::binary);
char info[100];
for(int j=0;j<100;j++)
info[j]='\0';
filei.read(info,99);
cout<<"读取完毕,输出:>"<<info<<endl; //改变代码后在“读取完毕,输出”后没有输出任何东西!!!
filei.close();
return 0;
}

这样就行了
回复 支持 反对

使用道具 举报

4#
发表于 2009-11-5 00:33:02 | 只看该作者
谢谢楼上的
我是想问为什么两种代码会导致不同的输出结果
ofstream fileo("C:\\测试文件夹\\test.bin",ios::binary);
char input='\0'; //从此处改变 char buffer[2]={'\0','\0'}
printf("写入文件:>"); // printf("写入文件:>");
while(input!='\r') // while(buffer[0]!='\r')
{ input=getche(); // { input=getche();
fileo<<input; // buffer[1]=buffer[0];
} // buffer[0]=input;
// if(buffer[0]!='\b')
// fileo<<buffer[1];
// } //试图在文件里面过滤掉backspace符
那位大侠能解释一下输出缓冲与文件流缓冲的关系
回复 支持 反对

使用道具 举报

5#
发表于 2009-11-5 00:33:03 | 只看该作者
//来调试一下就知道了.输入12 34 56
//...
while(buffer[0]!='\r')
{ //这个地方监视一轮就能出现问题
input=getche(); //input==1.
buffer[1]=buffer[0]; //buffer[1]=='\0',buffer[0]=='\0',input==1.
buffer[0]=input; //buffer[1]=='\0',buffer[0]=='1',input==1.
if(buffer[0]!=' ') //buffer[0]=='1'通过
fileo<<buffer[1]; //问题在这里,,buffer[1]=='\0'
} //试图在文件里面过滤掉backspace符
//文件里有\0... 后面的已经没必要知道了,但肯定不是\0 1 2 3 4 ...
printf("写入完成!\n");
fileo.close();
printf("文件关闭!\n");
ifstream filei("C:\\测试文件夹\\test.bin",ios::binary);
char info[100];
for(int j=0;j<100;j++)
info[j]='\0';
filei.read(info,99);//read()读取到第一个字符时就遇到\0.也就退出了,
//所以info是空的,当然就没有输出
cout<<"读取完毕,输出:>"<<info<<endl; //改变代码后在“读取完毕,输出”后没有输出任何东西!!!
filei.close();
return 0;
}
回复 支持 反对

使用道具 举报

6#
发表于 2009-11-5 00:33:05 | 只看该作者
呵呵,,是个小问题,希望lz以后仔细一点
回复 支持 反对

使用道具 举报

7#
发表于 2009-11-5 00:33:06 | 只看该作者
哦!!!恍然大悟 谢了
还问一个问题,为什么把 printf换成cout 后输出的顺序会变化?
回复 支持 反对

使用道具 举报

8#
发表于 2009-11-5 00:33:07 | 只看该作者
cout是有缓冲的.cout要endl才能刷新缓存区,printf是即时刷新
看看下面这个程序:
#include<iostream>
#include "stdio.h"
using namespace std;
main()
{
int iSize=1;
cout<<"cout iSize="<<++iSize+(++iSize)*iSize++<<"\n";
printf("printf iSize=%d \n",iSize);
return 0;
}
这个先输出printf这个.再把它改一下加个cout.flush();
#include <iostream>
#include "stdio.h"
using namespace std;
main()
{
int iSize=1;
cout<<"cout iSize="<<++iSize+(++iSize)*iSize++<<"\n";
cout.flush(); //
printf("printf iSize=%d \n",iSize);
return 0;
}
那么,这样输出顺序就换过来了

cout<<"cout iSize="<<++iSize+(++iSize)*iSize++<<"\n"; ->cout<<"cout iSize="<<++iSize+(++iSize)*iSize++<<endl; 也可以
回复 支持 反对

使用道具 举报

9#
发表于 2009-11-5 00:33:08 | 只看该作者
不知道楼上的想表达什么?
回复 支持 反对

使用道具 举报

10#
发表于 2009-11-5 00:33:10 | 只看该作者
为什么 printf换成cout 后输出的顺序会变化?


cout是有缓冲的.cout要endl,flush()才或者能刷新缓存区,printf是即时刷新;
当两者混用的时候,cout刷新缓存区需要一定的时间,所以会比printf后输出
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

申请友链|小黑屋|最新主题|手机版|新微赢技术网 ( 苏ICP备08020429号 )  

GMT+8, 2024-11-19 05:44 , Processed in 0.096478 second(s), 10 queries , Gzip On, Memcache On.

Powered by xuexi

© 2001-2013 HaiAn.Com.Cn Inc. 寰耽

快速回复 返回顶部 返回列表