c++ IO流---文件流

  • 流类体系

    • ofstream 类 打开文件进行写操作,用这个类去创建对象只能做写操作 output输出到文件

    • ifstream 类 读操作

    • fstream 类  创建对象可读可写 用的时候包含头文件 #include

  • 打开 & 关闭文件(都是类的成员函数)

    • 打开文件: void open(const char* URL,ios::openmode mode);文件路径 + 读写方式(ios::openmode类型的枚举类型,就是一个整型变量,访问静态数据成员用类名限定 ios::)

      • 读写方式

        • ios::in   读方式打开文件,不具备创建功能

        • ios::out 写方式打开文件,具备创建功能

        • ios::app 追加模式(在原文件的末尾接着写),具备创建功能

        • ios::ate (打开已有文件)文件指针指向文件末尾,类似追加,不具备创建功能

        • ios::trunc 具备创建功能

        • ios::nocreate 不具备创建

        • ios::noreplace 不替换 (写操作会清除原文件,如果原文件存在,就不删除原文件 保留原文件的数据,想想C语言 w方式)

        • ios::binary 二进制的读写方式

      • 读写的组合方式用的是 |(位或)无先后顺序

        • 可读可写可创建: ios::in | ios::out | ios::trunc

        • 二进制的可读可写可创建: ios::in | ios::out | ios::trunc | ios::binary

      • 判断打开文件是否成功

        • 用文件流对象重载的运算符 !- - - 取反代表失败

        • 用文件对象中的成员函数判断 is_open() - - - 取反代表失败

          • 返回 true 打开成功

          • 返回 false 打开失败

    • 关闭文件 void close()

  • 读写文件方式

    • 流的方式读写

    • 二进制的方式读写

    • string不能直接写到文件中去

      • 需要先转换为char* 再写进去,参数只能传入char*

  • 文件指针定位 - - - 不同对象的文件指针定位不同

    • ifstream类的对象

      • istream& seekg(long int pos);

      • istream& seekg(long int pos,ios_base::seekdir position);重载版本:位置 + 定位(枚举类型)

    • ofstream类的对象

      • ostream& seekp(long int pos);

      • ostream& seekp(long int pos,ios_base::seekdir position);

    • ios_base::seekdir

      • ios::beg 文件开始位置 //类似c语言中的SEEK_SET

      • ios::end 文件结束位置

      • ios::cur 文件当前位置

打开 & 关闭文件 & 判断文件是否打开失败

void testOpenFile() 
{
	fstream file;    //创建文件对象
	file.open("1.txt", ios::in);
	if (!file.is_open())
	{
		cerr << "文件打开失败" << endl;
		return;
	}
	if (!file) 
	{
		cout << "文件打开失败" << endl;
		return;
	}
	file.close();    //关闭文件
}

int main() 
{
	testOpenFile();
}

/*输出*/

文件打开失败

流的方式(ASCII码的方式)读写文件 - - - 把一个文件读到另一个文件中

void asciiRWFile(const char* readFileName, const char* writeFileName) 
{
	fstream read(readFileName, ios::in);    //也可以用直接构造的方式创建
	fstream write(writeFileName, ios::out); //分别用读&写的方式打开文件
	//成员函数 eof() 用于判断是否在文件末尾
	//1.1 流运算符的方式读写  空格和换行会被忽略
    /*while (!read.eof()) 
    {
       char key;          //用字符的方式读写
	   read >> key;       //汉字出现乱码 改编码方式为ANSI 原文件为UTF-8
       write << key;
    } */
	while (1) 
	{
		char key;
		read >> key;
		if (read.eof())   //读出来后写之前判断 防止多读了一次 把eof()读出来了
		{
			break;
		}
		write << key;
	}
	//1.2 成员函数的方式读写 会接收空格和换行 
	while (1) 
	{
		char key;
		read.get(key);
		if (read.eof())
			break;
		write.put(key);
	}
    //字符串的读写方式
	while (!read.eof())
	{
		char str[1024] = "";                    //出现覆盖的情况 每次读都要初始化
		read.getline(str, 1024);
		write.fstream::write(str, strlen(str)); //类名限定避免同名|统计读了多少后写入
		write.put('\n');  //strlen(str)+1 换行符没有在字符串中 一行行读出来未写入回车
	}
	read.close();
	write.close();
}
int main()
{
    asciiRWFile("read.txt","write.txt");
}

把 read.txt中的东西读到 write.txt中
ILoveYou
我喜欢你

ILoveYou我喜欢你

二进制的方式读写文件

void binaryRWFile(const char* readFileName, const char* writeFileName)
{
	fstream readFile(readFileName, ios::in | ios::binary);
	fstream writeFile(writeFileName, ios::out | ios::binary);
	while (!readFile.eof())
	{    
		char str[1024] = "";        //准备缓冲区
		readFile.read(str, 1024);   //读数据
		writeFile.write(str, 1024); //写入文件
	}
	readFile.close();
	writeFile.close();
}
int main()
{
    binaryRWFile("br.txt", "bw.txt");
}

wwww
eee
rr

wwww
eee
rr

文件指针移动

void testSeekRead(const char* fileName) //读取文件前4个和后4个
{
	fstream fread(fileName, ios::in);
	if (!fread) 
	{
		cout << "打开文件失败!" << endl;
	}
	char key = fread.get();    //第一次直接读出来---得到文件指针刚开始在I的位置
	cout << key;
	fread.seekg(4,ios::beg);   //相对于文件开始的位置移动4个位置 从第4个位置后面开始读
	key = fread.get();
	cout << key;
	fread.seekg(-4, ios::end); //文件指针在文件末尾从后往前读
	key = fread.get();
	cout << key << endl;
	fread.close();
}
int main()
{
    testSeekRead("test.txt");
}

ILoveYouMissYou

Ies(读的是后面那个s)            //文件指针第一次在I的位置 不是在I前面 I算是第一个位置

你可能感兴趣的:(C++,c++)