文档章节

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

王勋广
 王勋广
发布于 2016/04/22 00:23
字数 1537
阅读 18
收藏 0

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


© 著作权归作者所有

王勋广
粉丝 2
博文 10
码字总数 4668
作品 0
衡阳
程序员
私信 提问
Python_IO编程

本篇文章将介绍python里面的I/O编程。更多内容请参考:python学习指南 I/O编程 读写文件时最常见的IO操作。Python内置了读写文件的函数,用法和C是兼容的。 读写文件前,我们必须了解一下,在...

小七奇奇
2018/01/14
0
0
ParisGabriel:Python全栈工程师(0基础到精通)教程 第二十五课(文件操作、)

ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 为了梦想为了信仰                         Python人工智能从入门到精通 最近简直要死了 发烧感冒 喉咙痛。。。。...

ParisGabriel
2018/07/23
0
0
c语言基础学习10_关于文件操作的复习

============================================================================= 如果一个程序只调用fopen,而不调用fclose。会导致两个结果: (1)一个程序同时可以打开的文件数量是有限...

黑泽明军
2018/01/28
0
0
jiaba关键词提取提速策略&基于word2vec的关键词提取方法&python中文编码问题&人人网的关键词提取策略

1.jieba关键词提取提速 https://www.jianshu.com/p/450b84a07d3b 之前需要提取关键词,所以介绍了jieba关键词提取,这可能是最简单的提取关键词的方法了,此种方法代码少,(只有两行)但是速...

wong小尧
2018/03/23
0
0
c语言基础学习10_文件操作02

============================================================================= ============================================================================= 涉及到的知识点有: 六......

黑泽明军
2018/01/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Experts say the weaker pound is drawing investors to the UK tech sector

UK tech companies secured a record £5.5bn in foreign investment in the first seven months of this year, research shows. This was more than the amount invested per capita in th......

wowloop
22分钟前
5
0
Add support for Android 9-patch images in BorderImage

The 9-patch image implementation in Qt Quick Controls 1 is an internal implementation detail of the Android style. It cannot handle .9.png image files out of the box, but takes ......

shzwork
27分钟前
4
0
c/c++日期时间处理函数小结

日期时间处理函数: 日期时间转为字符串 strftime/std::put_time 字符串解析成日期时间 strptime/std::get_time 时间结构转换:time_t->tm localtime:time_t->tm 时间结构转换:tm->time_t ...

chuqq
31分钟前
5
0
Apache Flink 进阶入门(二):Time 深度解析

前言 Flink 的 API 大体上可以划分为三个层次:处于最底层的 ProcessFunction、中间一层的 DataStream API 和最上层的 SQL/Table API,这三层中的每一层都非常依赖于时间属性。时间属性是流处...

大涛学长
32分钟前
4
0
创龙基于Xilinx Artix-7系列FPGA处理器

SOM-TLA7是一款由广州创龙基于Xilinx Artix-7系列FPGA自主研发的核心板,可配套广州创龙Artix-7开发板使用。核心板尺寸仅70mm*50mm,采用沉金无铅工艺的10层板设计,专业的PCB Layout保证信号...

Tronlong创龙
38分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部