| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2290 人关注过本帖
标题:IO流与文件流的缓冲问题
只看楼主 加入收藏
Arcticanimal
Rank: 3Rank: 3
等 级:论坛游民
威 望:7
帖 子:341
专家分:20
注 册:2007-3-17
收藏
 问题点数:0 回复次数:21 
IO流与文件流的缓冲问题
//代码没多大意义,仅举个例子
#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流与文件流的缓冲有关,但还是不清楚
恳请那位大虾详细指教!

[此贴子已经被作者于2007-3-18 13:38:39编辑过]

搜索更多相关主题的帖子: 文件 缓冲 
2007-03-18 13:17
Arcticanimal
Rank: 3Rank: 3
等 级:论坛游民
威 望:7
帖 子:341
专家分:20
注 册:2007-3-17
收藏
得分:0 
没有人能够说说自己的看法吗

try new catch
2007-03-19 21:19
dlcdavid
Rank: 3Rank: 3
来 自:成都
等 级:新手上路
威 望:6
帖 子:193
专家分:0
注 册:2005-12-23
收藏
得分:0 
#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;
}

这样就行了

为了C++,我放弃了课本
为了高考,我又放弃了C++
现在而今眼目下,我能做什么?www.
2007-03-20 20:03
Arcticanimal
Rank: 3Rank: 3
等 级:论坛游民
威 望:7
帖 子:341
专家分:20
注 册:2007-3-17
收藏
得分:0 
谢谢楼上的
我是想问为什么两种代码会导致不同的输出结果
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符
那位大侠能解释一下输出缓冲与文件流缓冲的关系

try new catch
2007-03-20 20:13
dlcdavid
Rank: 3Rank: 3
来 自:成都
等 级:新手上路
威 望:6
帖 子:193
专家分:0
注 册:2005-12-23
收藏
得分:0 
回复:(Arcticanimal)IO流与文件流的缓冲问题
//来调试一下就知道了.输入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;
}

[此贴子已经被作者于2007-3-20 21:11:37编辑过]


为了C++,我放弃了课本
为了高考,我又放弃了C++
现在而今眼目下,我能做什么?www.
2007-03-20 20:31
dlcdavid
Rank: 3Rank: 3
来 自:成都
等 级:新手上路
威 望:6
帖 子:193
专家分:0
注 册:2005-12-23
收藏
得分:0 

呵呵,,是个小问题,希望lz以后仔细一点


为了C++,我放弃了课本
为了高考,我又放弃了C++
现在而今眼目下,我能做什么?www.
2007-03-20 20:32
Arcticanimal
Rank: 3Rank: 3
等 级:论坛游民
威 望:7
帖 子:341
专家分:20
注 册:2007-3-17
收藏
得分:0 
哦!!!恍然大悟 谢了
还问一个问题,为什么把 printf换成cout 后输出的顺序会变化?

try new catch
2007-03-20 21:15
yuyunliuhen
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:1435
专家分:0
注 册:2005-12-12
收藏
得分:0 

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; 也可以

[此贴子已经被作者于2007-3-20 22:02:29编辑过]


Go confidently in the  directions of your dreams,live the life you have imagined!Just do it!
It is no use learning without thinking!
2007-03-20 21:49
dlcdavid
Rank: 3Rank: 3
来 自:成都
等 级:新手上路
威 望:6
帖 子:193
专家分:0
注 册:2005-12-23
收藏
得分:0 
不知道楼上的想表达什么?

为了C++,我放弃了课本
为了高考,我又放弃了C++
现在而今眼目下,我能做什么?www.
2007-03-20 22:32
yuyunliuhen
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:1435
专家分:0
注 册:2005-12-12
收藏
得分:0 

为什么 printf换成cout 后输出的顺序会变化?


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

[此贴子已经被作者于2007-3-20 22:44:01编辑过]


Go confidently in the  directions of your dreams,live the life you have imagined!Just do it!
It is no use learning without thinking!
2007-03-20 22:41
快速回复:IO流与文件流的缓冲问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013028 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved