ep9_10.cpp
上传用户:wxcui2006
上传日期:2022-07-12
资源大小:1274k
文件大小:3k
源码类别:

书籍源码

开发平台:

Visual C++

  1. /*9.10 采用筛选法求100以内的所有素数(参见【例3.16】)。将所得数据存入文本文件和二进制文件。
  2. 对送入文本文件中的素数,要求存放格式是每行10个素数,每个数占6个字符,左对齐;可用任一文本编辑
  3. 器将它打开阅读。二进制文件整型数的长度请用sizeof()来获得,要求可以正序读出,也可以逆序读出
  4. (利用文件定位指针移动实现),读出数据按文本文件中的格式输出显示。*/
  5. /*前半题文本文件与习题3.17相同,只是哪里是右对齐,这里只了新做了二进制文件*/
  6. #include<fstream>
  7. #include<iostream>
  8. #include<iomanip>
  9. #include<cmath>
  10. using namespace std;
  11. const int n=100;
  12. int main(){
  13. ofstream ofile;
  14. ifstream ifile;
  15. int a[n],i,j;
  16. char ch,b[256];
  17. for(i=0;i<n;i++) a[i]=1+i; //用数组保存整数1-100
  18. a[0]=0; //1不是素数,置0
  19. for(i=0;i<n;i++){
  20. if(a[i]==0)  continue; //该数已经置0,判断下一个数
  21. for(j=i+1;j<n;j++) if(a[j]%a[i]==0) a[j]=0; //是a[i]倍数的元素置0;
  22. }
  23. ofile.open("myfile9_10.txt");
  24. int count=0;
  25. ofile.flags(ios::left);
  26. ofile<<"1-"<<n<<"之间的素数:"<<endl;
  27. for(i=0;i<n;i++) //输出所有素数
  28. if(a[i]!=0){
  29. ofile<<setw(6)<<a[i];
  30. count++;
  31. if(count%10==0)  ofile<<endl; //每行10个数据
  32. }
  33. ofile.close();
  34. cout<<"是否要将文本文件输出?Y或N"<<endl;
  35. cin>>ch;
  36. if(ch=='y'||ch=='Y'){
  37. ifile.open("myfile9_10.txt");
  38. i=0;
  39. while(ifile.get(b[i])){//读标题,不可用>>,它不能读白字符,
  40. if(b[i]=='n') break;
  41. i++;
  42. }
  43. b[i]='';
  44. cout.flags(ios::left);
  45. cout<<b<<endl;
  46. count=0;
  47. while(1){
  48. ifile>>i;//由文件读入
  49. if(ifile.eof()!=0) break;
  50. cout<<setw(6)<<i;//屏幕显示
  51. count++;
  52. if(count%10==0)  cout<<endl; //每行10个数
  53. }
  54. ifile.close();
  55. cout<<endl;
  56. }
  57. ofile.open("myfile9_10.dat",ios::out|ios::binary);
  58. for(i=0;i<n;i++) //输出所有素数
  59. if(a[i]!=0){
  60. ofile.write((char*)&a[i],sizeof(int));
  61. }
  62. ofile.close();
  63. cout<<"是否要将二进制文件输出?Y或N"<<endl;
  64. cin>>ch;
  65. if(ch=='y'||ch=='Y'){
  66. count=0;
  67. ifile.open("myfile9_10.dat",ios::in|ios::binary);
  68. ifile.clear(0);//采用标准库不可少,前面曾经读到过文件结束,无法恢复
  69. while(1){
  70. ifile.read((char*)&i,sizeof(int));
  71. if(ifile.eof()) break;
  72. cout<<setw(6)<<i;//屏幕显示
  73. count++;
  74. if(count%10==0)  cout<<endl;
  75. }
  76. ifile.close();
  77. cout<<endl;
  78. }
  79. cout<<"是否要将二进制文件逆序输出?Y或N"<<endl;
  80. cin>>ch;
  81. if(ch=='y'||ch=='Y'){
  82. count=0;
  83. ifile.open("myfile9_10.dat",ios::in|ios::binary);
  84. ifile.clear(0);//采用标准库不可少,前面曾经读到过文件结束,无法恢复
  85. while(1){
  86. ifile.read((char*)&i,sizeof(int));
  87. if(ifile.eof()!=0) break;
  88. count++;
  89. }
  90. ifile.clear(0);//当文件读完时,eofbit=1,不清0,后面的操作不能进行
  91. ifile.seekg(-4,ios::end);
  92. for(j=1;j<=count;j++){
  93. ifile.read((char*)&i,sizeof(int));
  94. cout<<setw(6)<<i;//屏幕显示
  95. if(j%10==0)  cout<<endl;
  96. ifile.seekg(-8,ios::cur);
  97. }
  98. ifile.close();
  99. cout<<endl;
  100. }
  101. return 0;
  102. }