程序运行时产生的数据者属于临时数据,程序一旦运行结束临时数据都会被释放。通过文件可以将数据持久化。
C++中对文件操作需要包含头文件
文件类型分为两种:
- 文本文件:文件以文本的ASCII码形式存储在计算机中
- 二进制文件:文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂文件内容
操作文件的三大类:
- ofstream 写操作
- ifstream 读操作
- fstream 读定操作
写文件步骤:
- 头文件包含 #include
- 创建流对象 ofstream ofs;
- 打开文件 ofs.open("文件路径", 打开方式);
- 写数据 ofs << "写入的数据";
- 关闭文件 ofs.close();
文件打开方式:
- ios::in 为读文件而打开文件
- ios::out 为写文件而打开文件
- ios::ate 初始位置:文件尾
- ios::app 追加方式写文件
- ios::trunc 如果文件存在先删除再创建
- ios::binary 二进制方式
文件打开方式可以配合使用,利用 | 操作符,如:用二进制方式写文件 ios::binary | ios::out
- #include
- #include
- using namespace std;
-
- int main()
- {
- //文件操作 - 文本文件 - 写文件
- /*
- 步骤:
- 1、头文件包含 #include
- 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
读文件与写文件步骤相似,但读取方式相对比较多。
读文件步骤:
- 头文件包含 #include
- 创建流对象 ifstream ifs;
- 打开文件判断文件是否打开成功 ifs.open("文件路径", 打开方式);
- 读数据 四种读取方式
- 关闭文件 ifs.close();
以下代码包含四种读取方式,默认打开第一种读取方式,如想使用其它三种,将某种代码注释去掉,注释掉其它三种即可。
- #include
- #include
- #include
- using namespace std;
-
- int main()
- {
- //文件操作 - 文本文件 - 读文件
- /*
- 步骤:
- 1、头文件包含 #include
- 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
二进制方式定文件主要利用流对象调用成员函数write
成员函数原型: ostream& write(const char * buffer, int len);
参数解释: 字符指针buffer指向内存中一段存储空间,len是读写的字节数。
- #include
- #include
- using namespace std;
-
- class Person
- {
- public:
- char name[64]; //二进制文件最好不用string类型,避免出现一些问题
- int age;
- };
-
- int main()
- {
- //文件操作 - 二进制文件 - 写文件
- /*
- 步骤:
- 1、头文件包含 #include
- 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" ,打开文件,查看内容如下,有乱码:
王小小
二进制方式读文件主要利用流对象调用成员函数read
成员函数原型: istream& read(char *buffer, int len);
参数说明: 字符指针buffer批向内存中一段存储空间,len是读写的字节数
- #include
- #include
- #include
- using namespace std;
-
- class Person
- {
- public:
- char name[64]; //二进制文件最好不用string类型,避免出现一些问题
- int age;
- };
-
- int main()
- {
- //文件操作 - 文本文件 - 读文件
- /*
- 步骤:
- 1、头文件包含 #include
- 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
文件打开方式
- os.O_CREATE 文件不存在则创建
- os.O_RDONLY 只读
- os.O_WRONLY 只写
- os.O_RDWR 可读可写
- os.O_TRUNC 文件长度截为0,即清空文件
- os.O_APPEND 在文件中追加新数据
- 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
读取文件方式一
- 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
- 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 ? 鐜嬪皬灏?*
注意:结构体中属性名首字母要大写,首字母小写则不写入文件
- 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}