新微赢技术网
标题:
IO流与文件流的缓冲问题
[打印本页]
作者:
大师傅
时间:
2009-11-5 00:32
标题:
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流与文件流的缓冲有关,但还是不清楚。
恳请那位大虾详细指教!
作者:
陪你疯→想你
时间:
2009-11-5 00:32
没有人能够说说自己的看法吗
作者:
駃旒_鎏蒗瀦
时间:
2009-11-5 00:32
#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;
}
这样就行了
作者:
阿玛比雷
时间:
2009-11-5 00:33
谢谢楼上的
我是想问为什么两种代码会导致不同的输出结果
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符
那位大侠能解释一下输出缓冲与文件流缓冲的关系
作者:
①個亼de鈊痛
时间:
2009-11-5 00:33
//来调试一下就知道了.输入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;
}
作者:
西山婉儿
时间:
2009-11-5 00:33
呵呵,,是个小问题,希望lz以后仔细一点
作者:
.`D.D`地`
时间:
2009-11-5 00:33
哦!!!恍然大悟 谢了
还问一个问题,为什么把 printf换成cout 后输出的顺序会变化?
作者:
日-出
时间:
2009-11-5 00:33
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; 也可以
作者:
兲外☆飛唬
时间:
2009-11-5 00:33
不知道楼上的想表达什么?
作者:
孤独与夜缠绵
时间:
2009-11-5 00:33
为什么 printf换成cout 后输出的顺序会变化?
cout是有缓冲的.cout要endl,flush()才或者能刷新缓存区,printf是即时刷新;
当两者混用的时候,cout刷新缓存区需要一定的时间,所以会比printf后输出
欢迎光临 新微赢技术网 (http://bbs.weiying.cn/)
Powered by Discuz! X3.2