C++ 学习(15)文件操作、文件文件读与写操作、二进制文件读与写操作

21 篇文章 10 订阅

程序运行时产生的数据者属于临时数据,程序一旦运行结束临时数据都会被释放。通过文件可以将数据持久化。

C++ 文件操作

C++中对文件操作需要包含头文件<fstream>

文件类型分为两种:

  1. 文本文件:文件以文本的ASCII码形式存储在计算机中
  2. 二进制文件:文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂文件内容

操作文件的三大类:

  1. ofstream 写操作
  2. ifstream 读操作
  3. fstream 读定操作

1、文本文件

(1)写文件

写文件步骤:

  1. 头文件包含  #include <fstream>
  2. 创建流对象 ofstream ofs;
  3. 打开文件    ofs.open("文件路径", 打开方式);
  4. 写数据       ofs << "写入的数据";
  5. 关闭文件   ofs.close();

文件打开方式:

  • ios::in            为读文件而打开文件
  • ios::out          为写文件而打开文件
  • ios::ate          初始位置:文件尾
  • ios::app         追加方式写文件
  • ios::trunc      如果文件存在先删除再创建
  • ios::binary    二进制方式

文件打开方式可以配合使用,利用 | 操作符,如:用二进制方式写文件 ios::binary | ios::out

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

int main()
{
	//文件操作 - 文本文件 - 写文件
	/*
	步骤:
		1、头文件包含  #include <fstream>
		2、创建流对象  ofstream ofs;
		3、打开文件    ofs.open("文件路径", 打开方式);
		4、写数据      ofs << "写入的数据";
		5、关闭文件    ofs.close();
	*/

	//2、创建流对象
	ofstream ofs;

	//3、打开文件
	ofs.open("26-文件-1-文本文件.txt", ios::trunc);

	//4、写数据  
	ofs << "姓名:Tracy" << endl;
	ofs << "年龄:20" << endl;
	ofs << "电话:13800000000" << endl;

	//5、关闭文件
	ofs.close();

	system("pause");

	return 0;
}

输出结果:在工程目录下已生成文件"26-文件-1-文本文件.txt" ,打开文件,查看内容如下:

姓名:Tracy
年龄:20
电话:13800000000

 (2)读文件(四种读取方式)

读文件与写文件步骤相似,但读取方式相对比较多。

读文件步骤:

  1. 头文件包含  #include <fstream>
  2. 创建流对象 ifstream ifs;
  3. 打开文件判断文件是否打开成功    ifs.open("文件路径", 打开方式);
  4. 读数据       四种读取方式
  5. 关闭文件   ifs.close();

以下代码包含四种读取方式,默认打开第一种读取方式,如想使用其它三种,将某种代码注释去掉,注释掉其它三种即可。 

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

int main()
{
	//文件操作 - 文本文件 - 读文件
	/*
	步骤:
		1、头文件包含  #include <fstream>
		2、创建流对象  ifstream ifs;
		3、打开文件判断文件是否打开成功    ifs.open("文件路径", 打开方式);
		4、读数据      四种读取方式
		5、关闭文件    ifs.close();
	*/

	//2、创建流对象
	ifstream ifs;

	//3、打开文件判断文件是否打开成功
	ifs.open("26-文件-1-文本文件.txt", ios::in);
	if (!ifs.is_open())
	{
		cout << "文件打开失败";
		return 0;
	}

	//4、读数据 - 四种读取方式
	//4.1、第一种读取方式
	cout << endl << "第一种读取方式" << endl;
	char buf[1024] = { 0 };
	while (ifs >> buf)
	{
		cout << buf << endl;
	}

	4.2、第二种读取方式
	//cout << endl << "第二种读取方式" << endl;
	//char buf2[1024] = { 0 };
	//while (ifs.getline(buf2, sizeof(buf2)))
	//{
	//	cout << buf2 << endl;
	//}

	4.3、第三种读取方式
	//cout << endl << "第三种读取方式" << endl;
	//string buf3;
	//while (getline(ifs, buf3))
	//{
	//	cout << buf3 << endl;
	//}

	4.4、第四种读取方式
	//cout << endl << "第四种读取方式" << endl;
	//char c;
	//while ((c = ifs.get()) != EOF)
	//{
	//	cout << c;
	//}

	//5、关闭文件
	ifs.close();

	system("pause");

	return 0;
}

 输出结果

第一种读取方式
姓名:Tracy
年龄:20
电话:13800000000

2、二进制文件

(1)写文件

二进制方式定文件主要利用流对象调用成员函数write

成员函数原型: ostream& write(const char * buffer, int len);

参数解释: 字符指针buffer指向内存中一段存储空间,len是读写的字节数。

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

class Person
{
public:
	char name[64]; //二进制文件最好不用string类型,避免出现一些问题
	int age;
};

int main()
{
	//文件操作 - 二进制文件 - 写文件
	/*
	步骤:
		1、头文件包含  #include <fstream>
		2、创建流对象  ofstream ofs;
		3、打开文件    ofs.open("文件路径", 打开方式);
		4、写数据      ofs.write(const char * buffer, int len);
		5、关闭文件    ofs.close();
	*/

	//2、创建流对象 , 创建后可直接打开文件,取代下面第3步
	ofstream ofs("26-文件-2-二进制文件.txt", ios::out | ios::binary);

	//3、打开文件
	//ofs.open("26-文件-2-二进制文件.txt", ios::out | ios::binary);

	//4、写数据  
	Person p = {"王小小", 21};
	ofs.write((const char *)&p, sizeof(p));

	//5、关闭文件
	ofs.close();

	system("pause");

	return 0;
}

输出结果:在工程目录下已生成文件"26-文件-2-二进制文件.txt" ,打开文件,查看内容如下,有乱码:

 王小小                                                             

(2)读文件

二进制方式读文件主要利用流对象调用成员函数read

成员函数原型: istream& read(char *buffer, int len);

参数说明: 字符指针buffer批向内存中一段存储空间,len是读写的字节数

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

class Person
{
public:
	char name[64]; //二进制文件最好不用string类型,避免出现一些问题
	int age;
};

int main()
{
	//文件操作 - 文本文件 - 读文件
	/*
	步骤:
		1、头文件包含  #include <fstream>
		2、创建流对象  ifstream ifs;
		3、打开文件判断文件是否打开成功    ifs.open("文件路径", 打开方式);
		4、读数据      istream& read(char *buffer, int len);
		5、关闭文件    ifs.close();
	*/

	//2、创建流对象
	ifstream ifs;

	//3、打开文件判断文件是否打开成功
	ifs.open("26-文件-2-二进制文件.txt", ios::in);
	if (!ifs.is_open())
	{
		cout << "文件打开失败";
		return 0;
	}

	//4、读数据
	Person p;
	ifs.read((char *)&p, sizeof(p));
	cout << "姓名:" << p.name << ", 年龄:" << p.age << endl;

	//5、关闭文件
	ifs.close();

	system("pause");

	return 0;
}

输出结果

姓名:王小小, 年龄:21

Go语言文件操作

文件打开方式

  • os.O_CREATE      文件不存在则创建
  • os.O_RDONLY      只读
  • os.O_WRONLY     只写
  • os.O_RDWR         可读可写
  • os.O_TRUNC       文件长度截为0,即清空文件
  • os.O_APPEND     在文件中追加新数据

1、文本文件

(1)写文件

package main

import (
	"fmt"
	"os"
)

func main() {
	//打开文件
	file, err := os.OpenFile("文本文件.txt", os.O_RDWR|os.O_CREATE, 755)
	if err != nil {
		fmt.Println("打开文件错误:", err)
		return
	}
	//关闭文件
	defer file.Close()

	//写入数据
	len, err := file.WriteString("姓名:Tracy")
	if err != nil {
		fmt.Println("写入文件错误: ", err)
	} else {
		fmt.Println("写入字符长度:", len)
	}
}

 输出结果:在工程目录下已生成文件"文本文件.txt" ,打开文件,查看内容如下:

姓名:Tracy

(2)读文件(三种读取方式)

读取文件方式一

package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	//打开文件
	file, err := os.Open("文本文件.txt")
	if err != nil {
		fmt.Println("打开文件出错: ", err)
		return
	}
	//关闭文件
	defer file.Close()

	//读取文件
	for {
		buf := make([]byte, 64)
		_, err := file.Read(buf)
		if err == io.EOF {
			break
		}
		fmt.Printf(string(buf))
	}
}

输出结果

 姓名:Tracy

读取文件方式二

package main

import (
	"fmt"
	"io/ioutil"
	"os"
)

func main() {
	//打开文件
	file, err := os.Open("文本文件.txt")
	if err != nil {
		fmt.Println("打开文件出错: ", err)
		return
	}
	//关闭文件
	defer file.Close()

	//读文件
	content, err := ioutil.ReadAll(file)
	if err != nil {
		fmt.Println("读取文件出错: ", err)
		return
	}
	fmt.Println(string(content))
}

输出结果

 姓名:Tracy

读取文件方式三

package main

import (
	"fmt"
	"io/ioutil"
)

func main() {
	//直接读文件
	content, err := ioutil.ReadFile("文本文件.txt")
	if err != nil {
		fmt.Println("读取文件出错: ", err)
		return
	}
	fmt.Println(string(content))
}

输出结果

 姓名:Tracy

2、二进制文件

(1)写文件

package main

import (
	"encoding/gob"
	"fmt"
	"os"
)

type Person struct {
	Name string
	Age int
}

func main() {
	//打开文件,没有则创建
	file, err := os.OpenFile("二进制文件.txt", os.O_CREATE | os.O_RDWR, 775)
	if err != nil {
		fmt.Println("打开文件出错: ", err)
		return
	}

	//关闭文件
	defer file.Close()

	//写入数据
	person := Person{ "王小小",  21}
	encoder := gob.NewEncoder(file)
	err = encoder.Encode(person)
	if err != nil {
		fmt.Println("写入文件报错: ", err)
		return
	}
}

输出结果:在工程目录下已生成文件"二进制文件.txt" ,打开文件,查看内容如下,有乱码: 

%?Person? Name  Age   ?    鐜嬪皬灏?* 

注意:结构体中属性名首字母要大写,首字母小写则不写入文件 

(2)读文件

package main

import (
	"encoding/gob"
	"fmt"
	"os"
)

type Person struct {
	Name string
	Age int
}

func main() {
	//打开文件,没有则创建
	file, err := os.OpenFile("二进制文件.txt", os.O_CREATE | os.O_RDONLY, 775)
	if err != nil {
		fmt.Println("打开文件出错: ", err)
		return
	}

	//关闭文件
	defer file.Close()

	//写入数据
	person := Person{ "王小小",  21}
	decoder := gob.NewDecoder(file)
	err = decoder.Decode(&person)
	if err != nil {
		fmt.Println("写入文件报错: ", err)
		return
	}
	fmt.Println(person)
}

输出结果

{王小小 21}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值