流类库和文件

1、流类库

(1)、C++中没有输入输出,标准库中包含一个I/O流类库。

C语言中printf 和scanf 称为函数; 输出到屏幕

C++中cout和cin称为对象;          输入是键盘

(2)、C++流类库中定义4个全局流对象,cin、cout、cerr、clog

cin 标准输入流对象,键盘

cout标准输出流,屏幕

cerr和clog标准错误输出流, 屏幕

其中cin、cout、clog是带缓冲区的,缓冲区由streambuf类对象来管理,cerr非缓冲区,一旦错误发生立即显示。

#include<iostream>
using namespace std;

int main(void){
    cerr<<"Error"<<endl; //错误直接输出
    cout<<"Hello"<<endl; //先放到缓冲区中
}

2、格式控制

会用,知道怎么查就行了,没必要记这些;

cout.flags(ios::hex); //hex这些在ios类中,以16进制输出;

0000 0000 0000 0000  有多少个1,就有什么功能;

ios::hex | ios::showbase            hex和showbase都是在ios类中定义的枚举,1-16各占一位;

3、文件

(1)、先定义一个文件对象流

(2)、打开某个文件

(3)、进行文件的读写

(4)、关闭文件

文本文件的操作,写入文件:

#include<iostream>
#include<fstream>//文件输出流头文件
#include<stdlib.h>
using namespace std;

int main(void){
    int ar[] = {1, 3, 5, 6, 7, 9,};
    //1、
    //ofstream ofile("Test1.txt", ios::out);与下2步等价
    ofstream ofile;
    //2、
    ofile.open("Test1.txt", ios::out);
    if(!ofile){
        cerr<<"Open File Fail!"<<endl;
        exit(1);
    }
    for(int i = 0; i < sizeof(ar)/sizeof(int); i++){
        ofile<<ar[i]<<" ";
    }

    ofile.close();
}

在文件中读出:

#include<iostream>
#include<fstream>//文件输出流头文件
#include<stdlib.h>
using namespace std;

int main(void){
    int ar[10];
    ifstream ifile;
    ifile.open("Test1.txt", ios::in);
    if(!ifile){
        cerr<<"Open File Fail"<<endl;
        exit(1);
    }
    for(int i = 0; i < 4; i++){
        ifile>>ar[i];
    }

    ifile.close();
}

4、二进制读写

写入文件:

#include<iostream>
#include<fstream>//文件输出流头文件
#include<stdlib.h>
using namespace std;

int main(void){
    int ar[] = {1, 3, 5, 6, 7, 9,};
    //1、
    //ofstream ofile("Test1.txt", ios::out);与下2步等价
    ofstream ofile;
    //2、
    ofile.open("Test1.txt", ios::out | ios::binary);
    if(!ofile){
        cerr<<"Open File Fail!"<<endl;
        exit(1);
    }
    ofile.write((char *)ar, sizeof(ar));//这样就不用循环了,一次性解决

    ofile.close();
}

从文件读出:

#include<iostream>
#include<fstream>//文件输出流头文件
#include<stdlib.h>
using namespace std;

int main(void){
    int ar[] = {1, 3, 5, 6, 7, 9,};
    //1、
    //ifstream ofile("Test1.txt", ios::out);
    ifstream ifile;
    //2、
    ifile.open("Test1.txt", ios::out | ios::binary);
    if(!ifile){
        cerr<<"Open File Fail!"<<endl;
        exit(1);
    }
    ifile.read((char *)ar, sizeof(ar));//这样就不用循环了,一次性全部读出

    ifile.close();
}

5、文件随机访问

随机读写关键靠文件指针;

        文件指针,开始指向第一个,读写就靠这个文件读写指针,会自动指向下一个;

#include<iostream>
#include<fstream>//文件输出流头文件
#include<stdlib.h>
using namespace std;

int main(void){
    ifstream ifile;

    ifile.open("Test1.txt", ios::in);
    if(!ifile){
        cerr<<"Open File Fail!"<<endl;
        exit(1);
    }
    int pos;
    int value;
    while(1){
        cout<<"请输入位置: ";
        cin>>pos;
        //beg  cur  end
        ifile.seekg(pos, ios::beg);//定位函数,pos,相对于什么地方开始
        ifile>>value; //将定位处的值放入value;
        cout<<"value = "<<value<<endl;
    }
    ifile.close();
}

文件可以定位读出,最好用二进制解决,每个数字都是4字节;就不用考虑每个数字跨几个字节;

文本文件在其中每个数字(0-9)占用1个字节,不好定位一个完整数字占用几个字节;

5、文件与对象

在C++程序设计中,文件应该在构造函数中打开,并创建对象,而在析构函数中保存和关闭文件,并撤销对象;

对文件而言,释放资源的同时包括将对象中的信息再次存入磁盘文件,在程序运行过程中,应将信息适时保存到相应

的磁盘文件,以免数据意外丢失。

文件与对象的有机结合(关键在构造和析构函数),以下就是一个相应的例子:

#include<iostream>
#include<fstream>
using namespace std;

class Complex;
ostream& operator<<(ostream &out, const Complex &t);

class Complex{
    friend ostream& operator<<(ostream &out, const Complex &t);
public:
    Complex() : real(0), image(0){
        ifstream ifile;
        ifile.open("Test.txt", ios::in);
        if(!ifile){
            cerr<<"Open File Fail"<<endl;
            exit(1);
        }
        ifile>>real>>image;
        ifile.close();
    }
    Complex(int rea, int imag) : real(rea), image(imag){}
    ~Complex(){
        ofstream ofile;
        ofile.open("Test.txt", ios::out);
        if(!ofile){
            cerr<<"Open File Fail"<<endl;
            exit(1);
        }
        ofile<<real<<" "<<image;
        ofile.close();
    }
public:
    void setComplex(int real, int image){
        this->real = real;
        this->image = image;
    }
private:
    int real;
    int image;
};

ostream& operator<<(ostream &out, const Complex &t){
    out<<"("<<t.real<<","<<t.image<<")";
    return out;
}
int main(void){
    Complex c;
    cout<<c<<endl;
    c.setComplex(100, 200);//模拟了在下一次实例化时把上一次读取出来。
//    cout<<c<<endl;//写进文件,保存设置。
}
时间: 2024-10-07 05:16:38

流类库和文件的相关文章

C++学习笔记55:流类库与输入输出

I/O流的概念及流类库的结构 程序与外界环境的信息交换 当程序与外界环境进行信息交换时,存在着两个对象:程序中的对象,文件对象. 流是一种抽象,负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动: 流对象与文件操作 程序建立一个流对象 指定这个流对象与某个文件对象建立连接 程序操作流对象 流对象通过文件系统对所连接的文件对象产生作用 提取与插入 读操作在流数据抽象中被称为从流中提取: 写操作被称为向流中写入: 最重要的三个输出流:ostream ofstream ostringstr

9、流类库与输入/输出

就像C语言一样,c++语言中也没有输入/输出语句.但c++编译系统带有一个面向对象的输入/输出软件爱你包,它就是I/O流类库. 1.I/O流的概念及流类库结构 I/O流类库是C语言中I/O函数在面向对象的程序设计方法中的一个替换产品. 当程序与外界环境进行信息交换时,存在着两个对象,一个是程序中的对象,另一个是文件对象. 流是一种抽象,它负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动.程序建立一个流对象,并指定这个流对象与某个文件对象建立连接,程序操作流对象,流对象通过文件系统对

C++学习47 文件的概念 文件流类与文件流对象 文件的打开与关闭

迄今为止,我们讨论的输入输出是以系统指定的标准设备(输入设备为键盘,输出设备为显示器)为对象的.在实际应用中,常以磁盘文件作为对象.即从磁盘文件读取数据,将数据输出到磁盘文件.磁盘是计算机的外部存储器,它能够长期保留信息,能读能写,可以刷新重写,方便携带,因而得到广泛使用. 文件(file)是程序设计中一个重要的概念.所谓“文件”,一般指存储在外部介质上数据的集合.一批数据是以文件的形式存放在外部介质(如磁盘.光盘和U盘)上的.操 作系统是以文件为单位对数据进行管理的,也就是说,如果想找存在外部

流类库

第10章 输入/输出流 I/O(输入/输出)流类库提供对象之间的数据交互服务. 流类库预定义了一批流对象,连接常用的外部设备. 程序员可以定义所需的I/O流对象,使用流类库提供的工作方式实现数据传输. 10.1 流类和流对象 10.2 标志流和流对象 10.3 格式控制 10.4 串流 10.5 文件处理 小结 10.1 流类和流对象 程序中,对数据的输入/输出是以字节流实现的. 应用程序对字节序列作出各种数据解释. I/O系统的任务就是在内存和外部设备之间稳定可靠地传输数据和解释数据. 流类对

Java 流(Stream)、文件(File)和IO

Java.io包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io包中的流支持很多种格式,比如:基本类型.对象.本地化字符集等等. 一个流可以理解为一个数据的序列.输入流表示从一个源读取数据,输出流表示向一个目标写数据. Java为I/O提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中. 但本文讲述最基本的和流与I/O相关的功能.我们将通过一个个例子来学习这些功能. 读取控制台输入 Java的控制台输入由System.in完成. 为了获得一

利用字节流和字节数组流是实现文件的复制

package ioxuexi; import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;i

InputStream流解析 XML文件

1 // 根据InputStream流解析 XML文件 2 private void getNewsFromStream(InputStream is){ 3 // 1.创建XML pull 解析器 谷歌内置解析器 4 XmlPullParser xp = Xml.newPullParser(); 5 try { 6 //2.指定解析器要解析的文件 和解析文件所用到的编码方式 7 xp.setInput(is,"utf-8"); 8 //3.开始解析文件(在解析之前需要有 JavaBe

java——用递归和IO流来实现文件的复制

1 import java.io.ByteArrayInputStream; 2 import java.io.ByteArrayOutputStream; 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.InputStream; 8 import java.io.Ou

nodejs用流来对文件操作

nodejs用流来对文件操作 by 伍雪颖 var fs = require('fs'); var reader = fs.createReadStream('in.txt'); var writer = fs.createWriteStream('out.txt'); reader.pipe(writer);