1、 输出文件由ofstream对象表示,创建方式:
ofstream outFile(“filename”);
默认是文本模式,当打开filename文件时,如果filename不存在,就会用这个名称和路径创建一个文件。
要求:
(1) 输入需要计算的质数个数,从小到大依次计算出相应的质数(例如,输入需要计算的质数个数为4,那么计算结果为{2,3,5,7});
(2) 将(1)中的计算结果以文本模式输出到文件中;
(3) 计算结果通过<<运算符写入文件,使用setw(10)控制输出格式;
提示:
判断质数的方法:
u 对正整数n,如果用2到 根号n之间的所有整数去除,均无法整除,则n为质数。
u 质数大于等于2 不能被它本身和1以外的数整除。
【修改前代码】
#include <iostream>
#include <iomanip>
#include <cmath>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
string toString(const int &v)
{
ostringstream os;
os << v;
return os.str();
}
int main()
{
int i,j,count=0;
unsigned int n;
cout << "请输入需要计算的质数个数:";
cin >> n;
ofstream outFile("");
vector<string>prime_num;
for (i =2; count < n; i++)
{
j = 2;
while (j <=sqrt(i))
{
if (i%j == 0) break;
j++;
}
if (j > sqrt(i))
{
prime_num.push_back(toString(i));
count++;
}
}
for (auto &i : prime_num)
{
outFile << setw(10) << i;
}
outFile.close();
return 0;
}
【修改后代码】
#include <iostream>
#include <iomanip>
#include <cmath>
#include <fstream>
#include <vector>
using namespace std;
int main()
{
int i, j;
unsigned int n, count = 0;
cout << "请输入需要计算的质数个数:";
cin >> n;
ofstream outFile("E:\\prime_num.dat");
//创建输出流对象和文件
vector<int>prime_num;
//定义一个int型vector对象来存质数
for (i = 2; count < n; i++)
//i为需要判断是否为质数的数
//利用count计算以求质数个数
{
j = 2;
while (j <= sqrt(i))
{
if (i%j == 0) break;
//如果i能整除j,则退出while循环
j++;
}
if (j > sqrt(i))
//如果j比根号i大,其实这时已经说明i为质数
{
prime_num.push_back(i);
//存入质数i
count++;
}
}
for (auto &i : prime_num)
//范围for语句将质数写入文件
{
outFile << setw(10) << i;
}
cout << "已将所需质数输入文件!" << endl;
outFile.close();
//关闭文件
return 0;
}
2、 输入文件由ifstream对象表示,创建方式:
ifstream inFile(“filename”);
输入文件时,需要检查文件流状态。1)使用inFile.is_open();2)对文件流使用!操作符(即 !inFile)。
要求:
(1) 读取题目1的输出文本文件;
(2) 检查输入文件流状态,若文件打开失败则抛出并捕获异常;
(3) 输出文件的总长度(以字节计);
(4) 将读取到的数据在屏幕输出,要求使用setw()控制输出格式;
【代码】
#include <cmath>
#include <iostream>
#include <vector>
#include <fstream>
#include <iomanip>
using namespace std;
int main()
{
int temp;//临时变量用于文件与屏幕输出的桥梁
ifstream inFile;
inFile.open("E:\prime_num.dat", ios::in);
try
{
if (!inFile)
throw ios_base::failure("");
inFile.seekg(0, ios::end);
//基地址为文件结束处,偏移地址为0,于是指针定位在文件结束处
streampos here = inFile.tellg();
//here为定位指针,因为它在文件结束处,所以也就是文件的大小
cout << "文件长度:" << here << endl;
inFile.seekg(0, ios::beg);
//基地址为文件头,偏移量为0,于是定位在文件头
while(inFile >> temp)
//逐个读取文件中字符,当然,空白不会读取
{
cout << setw(10) << temp;
}
}
catch (exception &e)
//捕获异常
{
cout << "Error:" << e.what() << endl;
}
inFile.close();
return 0;
}
二进制模式读写文件
3、 二进制模式创建输出文件流对象:
ofstream outFile(“filename”,ios_base::binary);
要求:
(1) 在题目1的基础上修改,将题目1中的计算结果以二进制模式写入文件;
提示:
(1) 二进制模式创建outFile输出流后,使用write(const char* s , streamsize n)函数,将计算结果写入文件。
【代码】
#include <iostream>
#include <iomanip>
#include <cmath>
#include <fstream>
#include <vector>
using namespace std;
int main()
{
int i, j;
unsigned int n, count = 0;
cout << "请输入需要计算的质数个数:";
cin >> n;
ofstream outFile("E:\\bin_prime_num.dat",ios_base::binary);
//二进制模式创建输出流对象和文件
vector<int>prime_num;
//定义一个int型vector对象来存质数
for (i = 2; count < n; i++)
//i为需要判断是否为质数的数
//利用count计算以求质数个数
{
j = 2;
while (j <= sqrt(i))
{
if (i%j == 0) break;
//如果i能整除j,则退出while循环
j++;
}
if (j > sqrt(i))
//如果j比根号i大,其实这时已经说明i为质数
{
prime_num.push_back(i);
//存入质数i
count++;
}
}
outFile.write((char*)&prime_num[0], sizeof(prime_num[0])*n);
//将所需质数全部写入文件
cout << "已将所需质数输入文件!" << endl;
outFile.close();
//关闭文件
return 0;
}
4、 二进制模式创建输入文件流对象:
ifstream inFile("fileName", ios::binary);
要求:
(1) 读取题目3的二进制文件;
(2) 检查输入文件流状态,若文件打开失败则抛出并捕获异常;
(3) 输出文件的总长度(以字节计),在报告中给出两种模式文件长度的对比分析;
(4) 将读取到的数据在屏幕输出,要求使用setw控制输出格式;
【代码】
#include <cmath>
#include <iostream>
#include <vector>
#include <fstream>
#include <iomanip>
using namespace std;
int main()
{
int temp;//临时变量用于文件与屏幕输出的桥梁
ifstream inFile("E:\\bin_prime_num.dat",ios_base::binary);
try
{
if (!inFile)
throw ios_base::failure("");
inFile.seekg(0, ios::end);
//基地址为文件结束处,偏移地址为0,于是指针定位在文件结束处
streampos here = inFile.tellg();
//here为定位指针,因为它在文件结束处,所以也就是文件的大小
cout << "文件长度:" << here << endl;
inFile.seekg(0, ios::beg);
//基地址为文件头,偏移量为0,于是定位在文件头
while (inFile.read((char*)&temp,sizeof(temp)))
{
cout << setw(10) << temp;
}
}
catch (exception &e)
//捕获异常
{
cout << "Error:" << e.what() << endl;
}
inFile.close();
return 0;
}
【二进制与文本两种模式文件长度的对比分析】
在本题中,文本模式下,输出到文件时设置输出域宽为10,所以每一个质数占10个字节,如果输入30个质数,则文件长度为10*30=300(字节);二进制模式下,由于质数为int型(4个字节),用write函数将所需全部质数写入文件后,文件长度就等于sizeof(int)*质数个数,比如,质数为30个,则文件长度等于120。