第九章 流类库和输入/输出习题 9
do{ s.get(c);//因为可能是回车 }while(c!='\\n'&&c!=')'&&c!=',');//读空数字串后的无用字符 if(c==','){ do{//只读数字串 s>>c; }while(c!='.'&&!(c>='0'&&c<='9')); s.putback(c); s>>im;//虚部 do{ s.get(c);//因为可能是回车 }while(c!='\\n'&&c!=')');//读空数字串后的无用字符 } else im=0;//无此步,第二次赋值出错 if(c!=')')s.clear(ios::failbit);//漏了括号给一个操作失败标志 } else{ s.putback(c);//无括号,返回一个字符到输入缓冲区 s>>re;//实部 do{ s.get(c);//因为可能是回车 }while(c!='\\n'&&c!=',');//读空数字串后的无用字符 if(c==','){ do{//只读数字串 s>>c; }while(c!='.'&&!(c>='0'&&c<='9')); s.putback(c); s>>im;//虚部 do{ s.get(c);//因为可能是回车 }while(c!='\\n');//读空数字串后的无用字符 } else im=0;//无此步,第二次赋值出错 } if(s) a=Complex(re,im); return s; }
int main(){ Complex a,b,c,d; cout<<\输入一个实数\ cin>>a; cout<<\输入一个复数\ cin>>b; cout<<\输入一个用括号括起来的实数\
第九章 流类库和输入/输出习题 10
cin>>c; cout<<\输入一个用括号括起来复数\ cin>>d; cout<<\ return 0; }
9.7 以文本方式把一个文本文件(如C++源文件)的前十行拷贝到一个新的文件中。
解:注意只能用于纯文本文件,如用于word文件则失败。word文档构造前面有一大堆说明,按文本读必然失败。第二,用传统的运行库,按行读有可能丢失一些回车,而用新的标准库则解决了这个问题。
用VC++标准库函数,即用头文件iostream时,如果函数未能读到结束字符而停止,流出错(输入输出操作失败),后面不再读入,必须清0流状态字,才能继续读入。一行字符分几次读完,原来有可能无法判断是读到结束字符结束还是读到指定字符结束,现在可以判断了:如果流正常,则读到了结束字符。
#include
#include //不包含 #include using namespace std; int main(){ int line=0; char filename[256],buf[256]; fstream sfile,dfile; cout<<\输入源文件路径名:\//请用s.txt,如用s.doc(word文档)则失败 cin>>filename;//对路径各方面而言空格是无关紧要的,否则要用getline()等成员函数 sfile.open(filename,ios::in);//打开一个已存在的文件 while(!sfile){ cout<<\源文件找不到,请重新输入路径名:\ sfile.clear(0);//出错后,状态必须清0 cin>>filename; sfile.open(filename,ios::in); } cout<<\输入目标文件路径名:\//请用d.txt cin>>filename; //只能创建文件,不能建立子目录,如路径不存在则失败 dfile.open(filename,ios::out); if(!dfile){ cout<<\目标文件创建失败\ return 1; } while(sfile.getline(buf,256),sfile.eof()!=1&&line<10){//按行拷贝 A行 if(sfile.rdstate()==0) { dfile<第九章 流类库和输入/输出习题 11
} else{ dfile<9.8 用二进制方式,把一个文件连接到另一个文件的尾部,选择适当的文件打开方式完成。 解:注意连接只能用于纯文本文件,如用于word文件则失败。
如果用word文档,则可见目标文档大小在翻倍,但只能读最前面一段。因为word文档构造前面有一大堆说明,真正连接时,后面的源文件前面的说明要去掉,但这做不到。 #include #include #include using namespace std; int main(){ int n; char filename[256],buf[100]; fstream sfile,dfile; cout<<\输入源文件路径名:\//请用s.txt cin>>filename;//对路径各方面而言空格是无关紧要的,否则要用getline()等成员函数 sfile.open(filename,ios::in|ios::binary);//打开一个已存在的二进制文件 while(!sfile){ cout<<\源文件找不到,请重新输入路径名:\ sfile.clear(0);//出错后,状态必须清0 cin>>filename; sfile.open(filename,ios::in|ios::binary); } cout<<\输入目标文件路径名:\//请用d.txt,s.txt接于其后;用源文件,会死循环(A行) cin>>filename; //只能创建文件,不能建立子目录,如路径不存在则失败 dfile.open(filename,ios::app|ios::out|ios::binary);//文件指针在尾部 if(!dfile){ cout<<\目标文件创建失败\ return 1; } while(!sfile.eof()){//二进制方式需另判文件是否结束 A sfile.read(buf,100); n=sfile.gcount(); dfile.write(buf,n);//按实际读取字节数写 }
第九章 流类库和输入/输出习题 12
sfile.close(); dfile.close(); return 0; }
9.9 同上题,采用重新定位文件指针方式来实现(随机访问方式)。 解:同样连接只能用于纯文本文件,如用于word文件则失败。
如果用word文档,则可见目标文档大小在翻倍,但只能读最前面一段。因为word文档构造前面有一大堆说明,真正链接时,后面的源文件前面的说明要去掉,但这做不到。 #include #include #include using namespace std; int main(){ int n; char filename[256],buf[100]; fstream sfile,dfile; cout<<\输入源文件路径名:\//请用s.txt cin>>filename;//对路径各方面而言空格是无关紧要的,否则要用getline()等成员函数 sfile.open(filename,ios::in|ios::binary);//打开一个已存在的二进制文件 while(!sfile){ cout<<\源文件找不到,请重新输入路径名:\ sfile.clear(0);//出错后,状态必须清0 cin>>filename; sfile.open(filename,ios::in|ios::binary); } cout<<\输入目标文件路径名:\//请用d.txt,s.txt接于其后;用源文件,会死循环(A行) cin>>filename; //只能创建文件,不能建立子目录,如路径不存在则失败 dfile.open(filename,ios::in|ios::out|ios::binary); //打开输入输出文件 if(!dfile){ dfile.clear(0); dfile.open(filename,ios::out); //建立输出文件 dfile.close(); dfile.open(filename,ios::in|ios::out|ios::binary); //改为输入输出文件 } dfile.seekp(0,ios::end);//写指针重定位到文件尾, seekp和seekg是同一个文件指针 while(!sfile.eof()){//二进制方式需另判文件是否结束 A sfile.read(buf,100); n=sfile.gcount(); dfile.write(buf,n);//按实际读取字节数写 } sfile.close(); dfile.close(); return 0;