文本模式与二进制模式读写文件(质数)

原创
2016/04/22 00:23
阅读数 26

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;

    //定义一个intvector对象来存质数

    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;

    //定义一个intvector对象来存质数

    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


展开阅读全文
打赏
1
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
1
分享
返回顶部
顶部