c++中的io流

c++中的io流

标准库iostream

这个在刚开始写c++的时候都会有这个。

  • cout \n cout 是ostream的一个实例对象,一般到标准的输出设备,比如显示屏,与”«“结合使用\n
  • cin \n cin 是istream的一个实例, 通过接收键盘等设备,常与”»“结合使用\n
  • cerr \n 标准错误流,cerr对象是非缓冲的,会立即输出,这估计是在提示报错这一类的里面常常用到,与”«“一起用\n
  • clog \n 标准日志流,是ostream的一个实例对象,clog的对象是缓冲的,通常会在缓冲区满的时候或刷新的时候才会输出。也与”«“一起用\n

虽然似乎无法区分cout,cerr, clog的区别,但是在做大型的项目的时候,就会体现出来。通过用cerr来显示错误信息,日志信息用clog.

今天学的是fstream, 即文件流,file stream

fstream

它有三个数据类型,应该是子类

  1. ofstream 文件输出流
  2. ifstream 文件输入流
  3. fstream 文件输入输出流 可能标准的意思就是不是文件之类的东西吧。 用这些的时候需要包含头文件
    void open(const char *filename, ios::openmode mode);
    

    第一个参数是文件名,第二个参数是被打开的模式。 常用的有下面几种模式,

  4. ios::app append模式
  5. ios::in 打开文件用于读取
  6. ios::out 打开文件用于写入
  7. ios::trunc 如果该文件已经存在,其内容将在打开文件之前被截断,即长度为0了,相当于把里面已有的进行一个清理。应该就是覆盖的模式。 上面的模式可以结合使用。比如
    fstream afile;  //声明文件输入输出流对象
    afile.open("file.txt", ios::out | ios::in);  //对象调用其方法
    

    使用之前需要先声明对象(忽然想起来了之前学Java的时候的感觉了)

然后还要记得关闭文件。即void close()它是fstream, ifstream, ofstream都有的方法。

其实还可以用另一种方式来打开文件,即在创建文件流时用构造函数打开文件

ofstream outfile("text.txt", ios::out);   //使用相对路径打开文件

如果打开成功,文件流对象为非0值,失败的话为0值。

读取和写入文件

第一个例子。

#include <iostream>
#include <fstream>

using namespace std;
int main(){
    fstream file("test.txt", ios::out);
    if(!file.fail())
    {
        cout<<"Starting to write"<<endl;
        file<<"name"<<endl;
    }
    else
    {   
        cout<<"cannot open "<<endl;
    }   
    
    file.close();
    return 0;
}

第二个例子

#include <fstream>
#include <iostream>

using namespace std;

int main(){
    char data[100];

    //以写的模式打开一个文件
    //声明文件输出流对象
    ofstream outfile;
    outfile.open("file.txt")
    cout<<"Enter your name";
    cin.getline(data, 100);
    
    //向文件写入用户输入的数据
    outfile<<data<<endl;   
    //注意以前常用cout<<是向屏幕输出,而现在是向文件输出,所以是文件输出流对象
    outfile.close();

    //以读的模式打开
    ifstream infile;
    infile.open("file.txt");
    infile>>data;
    //在屏幕上显示
    cout<<data<<endl;
    infile.close();

    return 0;

}

此外判断文件是否读到末尾了可以用file.eof()通常会这样用while(!file.eof()).

看下面的例子。

#include <iostream>
#include <fstream>
using namespace std;
int main(){
    fstream file("test.txt", ios::in);
    if(!file.fail()){
        while(!file.eof()){
            char buf[128];
            file.getline(buf,128);  //应该是从buf读128个字节
            if(file.tellg()>0){  //获得当前"get指针"的位置
                cout<<buf;
                cout<<endl;
            }
        }

    }
    else{
        cout<<"cannot open"<<endl;
    }
    file.close();

    return 0;
}

二进制文件的读写要用ios::binary模式。对二进制读写需要使用read和write方法。

下面是几个例子

  • 文本文件的写入
#include <iostream>
#include <fstream>

using namespace std;

int main(){
    fstream out("out.txt", ios::out);
    if(out.is_open()){
        out << "My first text file.\n";
        out << "another line.\n";

        out.close();
    }   
    

    return 0;
}



结果在out.txt中就是

1 My first text file.
2 another line.

再看下面一个例子,用的是上面的那个out.txt

#include <iostream>
#include <fstream>
#include <stdlib.h>
using namespace std;


int main(){
    char buffer[256];
    fstream in; 
    in.open("out.txt", ios::in);
    cout<<in.is_open()<<endl;
    if(! in.is_open()){
        cout<<"Error opening file";
        exit(1);
    }   
    while(!in.eof()){  // 当不是结尾的时候
        in.getline(buffer, 100);   // 这个的意思是从流`in`中向buffer中写入100个字节, 而buffer就是接这个流的东西。
        cout <<buffer <<endl;
    }   

    return 0;
}


  • 获得和设置流指针
tellg() 和tellp()
seekg() 和 seekp()

里面常放的参数有

ios::beg
ios::cur
ios::end

比如下面一个例子

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

const char * filename = "label.bin";
int main(){
    long l, m;
    ifstream in(filename, ios::in|ios::binary);
    l = in.tellg();
    cout<<"l"<<l<<endl;
    in.seekg(0, ios::end);   //定位到结尾。
    m = in.tellg();
    cout <<m<<endl;
    cout<<m-l<<endl;

    in.seekg(0, ios::beg);   // 定位到开始。
    
    /*
    int nImgCnt, nFeatDim, dsize, dtype;
    
    in.read((char*)&nImgCnt, sizeof(nImgCnt));
    in.read((char*)&nFeatDim, sizeof(nFeatDim));
    in.read((char*)&dsize, sizeof(dsize));
    in.read((char*)&dtype, sizeof(dtype));



    cout<<nImgCnt<<" "<<nFeatDim<<" "<<dsize<<" "<<dtype<<endl;
    */
    in.close();
    return 0;

}

打赏,谢谢~~

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,多谢支持~

打开微信扫一扫,即可进行扫码打赏哦