C++文件流fstream详细说明

C++文件流。
首先需要包含头文件#include< fstream >
fstream可以把它理解成一个父类,包含的子类有ifstream和ofstream等,
fstream:文件输入输出类。表示文件级输入输出流(字节流);
ifstream:文件输入类。表示从文件内容输入,也就是读文件;
ofstream:文件输出类。表示文件输出流,即文件写。
所以一般直接创建一个父类对象即可(即fstream类的对象)

C++中seep()和seekg()函数功能
seekg:设置输入文件流的文件流指针位置
seekp:设置输出文件流的文件流指针位置

C++文件流检测EOF
成员函数eof()用来检测是否到达文件尾,如果到达文件尾返回非0值,否则返回0。原型是inteof();
例:if(in.eof())ShowMessage("已经到达文件尾!");
C++文件流文件定位
和C的文件操作方式不同的是,C++ I/O系统管理两个与一个文件相联系的指针。一个是读指针,它说明输入操作在文件中的位置;另一个是写指针,它下次写操作的位置。每次执行输入或输出时,相应的指针自动变化。所以,C++的文件定位分为读位置和写位置的定位,对应的成员函数是 seekg()和 seekp(),seekg()是设置读位置,seekp是设置写位置。它们最通用的形式如下:
1.  istream &seekg(streamoff offset,seek_dir origin);  
2.  ostream &seekp(streamoff offset,seek_dir origin);  

函数原型:
ostream& seekp( streampos pos );
ostream& seekp( streamoff off, ios::seek_dir dir );
istream& seekg( streampos pos );
istream& seekg( streamoff off, ios::seek_dir dir );
函数参数
pos:新的文件流指针位置值
off:需要偏移的值
dir:搜索的起始位置
dir参数用于对文件流指针的定位操作上,代表搜索的起始位置


seekg(绝对位置);      //绝对移动,    //输入流操作  
seekg(相对位置,参照位置);  //相对操作  
tellg();          //返回当前指针位置  
seekp(绝对位置);      //绝对移动,    //输出流操作  
seekp(相对位置,参照位置);  //相对操作     
tellp();          //返回当前指针位置  


在ios中定义的枚举类型:
enum seek_dir {beg, cur, end};
每个枚举常量的含义:
ios::beg:文件流的起始位置
ios::cur:文件流的当前位置
ios::end:文件流的结束位置
这两个函数一般用于二进制文件,因为文本文件会因为系统对字符的解释而可能与预想的值不同。
例:
1.  file1.seekg(1234,ios::cur);//把文件的读指针从当前位置向后移1234个字节  
2.  file2.seekp(1234,ios::beg);//把文件的写指针从文件开头向后移1234个字节 

下边的代码讲解了
1:4种文件的读写操作
2:如何使用get(),put(),getline(),write()以及read()函数。
3:如何得到文件的大小。
4:seekg()和teelg()配套使用的真谛,seekp()和teelp()同理

//文件流;
#include<iostream>
#include<fstream>  //ifstream  ofstream
using namespace std;
/*
    No1.文件流流类
    ofstream:打开文件,写文件
    ifstream:打开文件,读操作
    fstream:可读可写
    No2.一般用包含#include<fstream>
    No3.打开文件,关闭文件
    打开文件:
    void open(const char* URL,ios::openmode mode);
    mode: 
        ios:in  读的方式打开文件
        ios:out 写的方式打开文件
        ios::app 追加的方式写文件
        ios::ate  在已有的文件,文件指针在文件末尾
        ios::trunc  文件不存在,创建文件
        ios::binary  二进制形式打开文件,默认方式ASCII码方式打开
        ios::nocreate  不创建的方式
        ios::norepalce  不替换
    组合方式:用的是位或
        ios::in|ios::out 可读写
        ios::out|ios::binary 二进制写的方式打开文件,
    判断文件是否打开成功:
        1.is_open() 判断打开是否成功
        2.!文件对象  判断文件是否打开成佛那个
    关闭文件:close()成员函数关闭;
    */
void testOpenFile() {    //用于测试用的函数
    //C++中打开文件是文件对象,不是文件指针。

    fstream File,File1;
    File.open("2.txt", ios::in | ios::out );
    File1.open("3.txt", ios::in | ios::out | ios::trunc);
    //使用open函数和直接用构造函数是一样的效果。
    if (!File.is_open()) {
        cerr << "2.txt 打开文件失败!!\n";
    }
    if (!File) {
        cerr << "2.txt打开文件失败!!!\n";
    }//这个if语句和上一个if语句作用相同
    if (!File1.is_open()) {
        cerr << "3.txt打开文件失败!!\n";
    }
    else {
        cout << "3.txt 打开成功!!!\n";
    }
    File.close();
    File1.close();
}
//No2.读写方式:
void asciiReadWriteFile(const char* readFileName, const char* writeFileName) {
    fstream read(readFileName, ios::in);
    fstream write(writeFileName, ios::out);
    //第一种读写方式:ASCII  直接流的方式读写, >>  <<
    /*while (1) {
        char temp;
        read >> temp;
        if (read.eof()) {
            break;
        }
        write << temp;
    }*/
    //第二种方式读写方式:可以保留空格和换行,用get()和put();
    /*while (1) {
        char temp;
        read.get(temp);
        //temp=read.get();一样的效果!
        if (read.eof()) {
            break;
        }
        write.put(temp);
    }*/
    //第三种读写方式:不能保留空格和换行,用getline()和write().
    char str[40]; 
    while (!read.eof()) {
        memset(str, ' ', 40);
        read.getline(str,40);
        int len = strlen(str);
        write.write(str,len);
        write.put('\n');
    }
}
//使用二进制读写方式  使用read()和write()函数来实现
void binaryReadWriteFile(const char* readFile, const char* writeFile) {
    fstream read(readFile, ios::in | ios::binary);
    fstream write(writeFile, ios::out | ios::binary);
    while (!read.eof()) {
        char str[1024]="";
        read.read(str, 1024);
        
        write.write(str, 1024);
    }
    read.close();
    write.close();
}
//
void testSeekReadFile(const char* fileName) {
    fstream fread(fileName, ios::in);
    fstream fwrite(fileName, ios::app|ios::out);
    if (!fread) {
        cerr << "打开文件\"fileName\"!失败!";
    }
    int f = fread.tellg();
    fread.seekg(0,ios::end);
    int l = fread.tellg();
    cout << "size  of  " << fileName << "is "<<(l - f) << "bytes.";
    fread.seekg(5);//表示将指针位置设置到绝对位置5;
    cout << (char)fread.get() << endl;
    fread.seekg(-1, ios::cur);        //seekg的第一个参数为负,表示从当前位置往前移
    cout << (char)fread.get() << endl;
    fread.seekg(1, ios::cur);//第一个参数为正,表示从当前位置往后数的第一个位置。
    
    fwrite.put('w');//在末尾追加写。
}
int main() {
    testOpenFile();
    asciiReadWriteFile("read.txt","write.txt");
    binaryReadWriteFile("read.txt", "binaryTest.txt");
    testSeekReadFile("read.txt");
    return 0;
}
 

猜你喜欢

转载自blog.csdn.net/qq_20853741/article/details/125024424