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


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

    C++ 文件操作

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

    文件类型分为两种:

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

    操作文件的三大类:

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

    1、文本文件

    (1)写文件

    写文件步骤:

    1. 头文件包含  #include
    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

    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. //文件操作 - 文本文件 - 写文件
    7. /*
    8. 步骤:
    9. 1、头文件包含  #include
    10. 2、创建流对象 ofstream ofs;
    11. 3、打开文件    ofs.open("文件路径", 打开方式);
    12. 4、写数据      ofs << "写入的数据";
    13. 5、关闭文件   ofs.close();
    14. */
    15. //2、创建流对象
    16. ofstream ofs;
    17. //3、打开文件
    18. ofs.open("26-文件-1-文本文件.txt", ios::trunc);
    19. //4、写数据 
    20. ofs << "姓名:Tracy" << endl;
    21. ofs << "年龄:20" << endl;
    22. ofs << "电话:13800000000" << endl;
    23. //5、关闭文件
    24. ofs.close();
    25. system("pause");
    26. return 0;
    27. }

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

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

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

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

    读文件步骤:

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

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

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. int main()
    6. {
    7. //文件操作 - 文本文件 - 读文件
    8. /*
    9. 步骤:
    10. 1、头文件包含  #include
    11. 2、创建流对象 ifstream ifs;
    12. 3、打开文件判断文件是否打开成功    ifs.open("文件路径", 打开方式);
    13. 4、读数据      四种读取方式
    14. 5、关闭文件    ifs.close();
    15. */
    16. //2、创建流对象
    17. ifstream ifs;
    18. //3、打开文件判断文件是否打开成功
    19. ifs.open("26-文件-1-文本文件.txt", ios::in);
    20. if (!ifs.is_open())
    21. {
    22. cout << "文件打开失败";
    23. return 0;
    24. }
    25. //4、读数据 - 四种读取方式
    26. //4.1、第一种读取方式
    27. cout << endl << "第一种读取方式" << endl;
    28. char buf[1024] = { 0 };
    29. while (ifs >> buf)
    30. {
    31. cout << buf << endl;
    32. }
    33. 4.2、第二种读取方式
    34. //cout << endl << "第二种读取方式" << endl;
    35. //char buf2[1024] = { 0 };
    36. //while (ifs.getline(buf2, sizeof(buf2)))
    37. //{
    38. // cout << buf2 << endl;
    39. //}
    40. 4.3、第三种读取方式
    41. //cout << endl << "第三种读取方式" << endl;
    42. //string buf3;
    43. //while (getline(ifs, buf3))
    44. //{
    45. // cout << buf3 << endl;
    46. //}
    47. 4.4、第四种读取方式
    48. //cout << endl << "第四种读取方式" << endl;
    49. //char c;
    50. //while ((c = ifs.get()) != EOF)
    51. //{
    52. // cout << c;
    53. //}
    54. //5、关闭文件
    55. ifs.close();
    56. system("pause");
    57. return 0;
    58. }

     输出结果

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

    2、二进制文件

    (1)写文件

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

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

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

    1. #include
    2. #include
    3. using namespace std;
    4. class Person
    5. {
    6. public:
    7. char name[64]; //二进制文件最好不用string类型,避免出现一些问题
    8. int age;
    9. };
    10. int main()
    11. {
    12. //文件操作 - 二进制文件 - 写文件
    13. /*
    14. 步骤:
    15. 1、头文件包含  #include
    16. 2、创建流对象 ofstream ofs;
    17. 3、打开文件    ofs.open("文件路径", 打开方式);
    18. 4、写数据      ofs.write(const char * buffer, int len);
    19. 5、关闭文件   ofs.close();
    20. */
    21. //2、创建流对象 , 创建后可直接打开文件,取代下面第3步
    22. ofstream ofs("26-文件-2-二进制文件.txt", ios::out | ios::binary);
    23. //3、打开文件
    24. //ofs.open("26-文件-2-二进制文件.txt", ios::out | ios::binary);
    25. //4、写数据 
    26. Person p = {"王小小", 21};
    27. ofs.write((const char *)&p, sizeof(p));
    28. //5、关闭文件
    29. ofs.close();
    30. system("pause");
    31. return 0;
    32. }

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

     王小小                                                             

    (2)读文件

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

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

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

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. class Person
    6. {
    7. public:
    8. char name[64]; //二进制文件最好不用string类型,避免出现一些问题
    9. int age;
    10. };
    11. int main()
    12. {
    13. //文件操作 - 文本文件 - 读文件
    14. /*
    15. 步骤:
    16. 1、头文件包含  #include
    17. 2、创建流对象 ifstream ifs;
    18. 3、打开文件判断文件是否打开成功    ifs.open("文件路径", 打开方式);
    19. 4、读数据      istream& read(char *buffer, int len);
    20. 5、关闭文件    ifs.close();
    21. */
    22. //2、创建流对象
    23. ifstream ifs;
    24. //3、打开文件判断文件是否打开成功
    25. ifs.open("26-文件-2-二进制文件.txt", ios::in);
    26. if (!ifs.is_open())
    27. {
    28. cout << "文件打开失败";
    29. return 0;
    30. }
    31. //4、读数据
    32. Person p;
    33. ifs.read((char *)&p, sizeof(p));
    34. cout << "姓名:" << p.name << ", 年龄:" << p.age << endl;
    35. //5、关闭文件
    36. ifs.close();
    37. system("pause");
    38. return 0;
    39. }

    输出结果

    姓名:王小小, 年龄:21

    Go语言文件操作

    文件打开方式

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

    1、文本文件

    (1)写文件

    1. package main
    2. import (
    3. "fmt"
    4. "os"
    5. )
    6. func main() {
    7. //打开文件
    8. file, err := os.OpenFile("文本文件.txt", os.O_RDWR|os.O_CREATE, 755)
    9. if err != nil {
    10. fmt.Println("打开文件错误:", err)
    11. return
    12. }
    13. //关闭文件
    14. defer file.Close()
    15. //写入数据
    16. len, err := file.WriteString("姓名:Tracy")
    17. if err != nil {
    18. fmt.Println("写入文件错误: ", err)
    19. } else {
    20. fmt.Println("写入字符长度:", len)
    21. }
    22. }

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

    姓名:Tracy

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

    读取文件方式一

    1. package main
    2. import (
    3. "fmt"
    4. "io"
    5. "os"
    6. )
    7. func main() {
    8. //打开文件
    9. file, err := os.Open("文本文件.txt")
    10. if err != nil {
    11. fmt.Println("打开文件出错: ", err)
    12. return
    13. }
    14. //关闭文件
    15. defer file.Close()
    16. //读取文件
    17. for {
    18. buf := make([]byte, 64)
    19. _, err := file.Read(buf)
    20. if err == io.EOF {
    21. break
    22. }
    23. fmt.Printf(string(buf))
    24. }
    25. }

    输出结果

     姓名:Tracy

    读取文件方式二

    1. package main
    2. import (
    3. "fmt"
    4. "io/ioutil"
    5. "os"
    6. )
    7. func main() {
    8. //打开文件
    9. file, err := os.Open("文本文件.txt")
    10. if err != nil {
    11. fmt.Println("打开文件出错: ", err)
    12. return
    13. }
    14. //关闭文件
    15. defer file.Close()
    16. //读文件
    17. content, err := ioutil.ReadAll(file)
    18. if err != nil {
    19. fmt.Println("读取文件出错: ", err)
    20. return
    21. }
    22. fmt.Println(string(content))
    23. }

    输出结果

     姓名:Tracy

    读取文件方式三

    1. package main
    2. import (
    3. "fmt"
    4. "io/ioutil"
    5. )
    6. func main() {
    7. //直接读文件
    8. content, err := ioutil.ReadFile("文本文件.txt")
    9. if err != nil {
    10. fmt.Println("读取文件出错: ", err)
    11. return
    12. }
    13. fmt.Println(string(content))
    14. }

    输出结果

     姓名:Tracy

    2、二进制文件

    (1)写文件

    1. package main
    2. import (
    3. "encoding/gob"
    4. "fmt"
    5. "os"
    6. )
    7. type Person struct {
    8. Name string
    9. Age int
    10. }
    11. func main() {
    12. //打开文件,没有则创建
    13. file, err := os.OpenFile("二进制文件.txt", os.O_CREATE | os.O_RDWR, 775)
    14. if err != nil {
    15. fmt.Println("打开文件出错: ", err)
    16. return
    17. }
    18. //关闭文件
    19. defer file.Close()
    20. //写入数据
    21. person := Person{ "王小小", 21}
    22. encoder := gob.NewEncoder(file)
    23. err = encoder.Encode(person)
    24. if err != nil {
    25. fmt.Println("写入文件报错: ", err)
    26. return
    27. }
    28. }

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

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

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

    (2)读文件

    1. package main
    2. import (
    3. "encoding/gob"
    4. "fmt"
    5. "os"
    6. )
    7. type Person struct {
    8. Name string
    9. Age int
    10. }
    11. func main() {
    12. //打开文件,没有则创建
    13. file, err := os.OpenFile("二进制文件.txt", os.O_CREATE | os.O_RDONLY, 775)
    14. if err != nil {
    15. fmt.Println("打开文件出错: ", err)
    16. return
    17. }
    18. //关闭文件
    19. defer file.Close()
    20. //写入数据
    21. person := Person{ "王小小", 21}
    22. decoder := gob.NewDecoder(file)
    23. err = decoder.Decode(&person)
    24. if err != nil {
    25. fmt.Println("写入文件报错: ", err)
    26. return
    27. }
    28. fmt.Println(person)
    29. }

    输出结果

    {王小小 21}

  • 相关阅读:
    echarts公司内部图表(冒死上传)
    AtCoder Beginner Contest 311 D(dfs/bfs)
    pytorch深度学习实战15
    升讯威在线客服系统的并发高性能数据处理技术:为多线程处理同步数据
    Sweet Snippet 之 计算 MaxSortedDistance
    说说商标注册
    程序和进程
    22.(地图工具篇)geoserver点服务图层SLD样式效果1
    软件测试中如何测试算法?
    Docker 网络
  • 原文地址:https://blog.csdn.net/ling1998/article/details/126018653