• C++学习笔记(十七)


    在完成对C语言的学习后,我最近开始了对C++和Java的学习,目前跟着视频学习了一些语法,也跟着敲了一些代码,有了一定的掌握程度。现在将跟着视频做的笔记进行整理。本篇博客是整理C++知识点的第十七篇博客。

    本篇博客介绍了C++的文件操作。

    本系列博客所有C++代码都在Visual Studio 2022环境下编译运行。程序为64位。

    目录

    文件操作

    文件操作简介

    文本文件写文件

    文本文件读文件

    二进制文件写文件

    二进制文件读文件


    文件操作

    文件操作简介

    程序运行时产生的数据都是临时的,程序运行结束后都会释放。通过程序与文件的交互可以使数据持久化。

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

    文件类型分为两种,文本文件二进制文件

    文本文件以文本的ASCII码形式存储在计算机中。二进制文件以文本的二进制形式存储在计算机中,一般不能直接读懂。

    操作文件分为三大类,ofstream表示写操作,ifstream表示读操作,fstream表示读写操作。

    文本文件写文件

    写文件需要创建一个ofstream的流对象。随后用这个对象的open函数,格式是流对象名.open("文件路径",打开方式)。

    打开文件后可以写文件,格式是流对象名 << "写入的数据"

    在完成所有对文件的操作后,需要关闭文件,格式是流对象名.close()

    ios::in表示为读文件而打开文件。ios::out表示为写文件而打开文件。ios::ate将初始位置放在文件尾。ios::app以追加的方式写文件。ios::trunc表示如果文件存在,先删除再创建。ios::binary表示二进制形式读写。

    文件打开方式可以通过利用|操作配合使用。

    1. #include
    2. #include
    3. using namespace std;
    4. int main(void)
    5. {
    6. ofstream ofs;
    7. ofs.open("test.txt", ios::out);
    8. ofs << "Hello world" << endl;
    9. ofs << "Hello C++" << endl;
    10. ofs.close();
    11. return 0;
    12. }

    这段代码将Hello world和Hello C++写入test.txt文件中。程序控制台无输出。文件test.txt的内容是:

    Hello world
    Hello C++
     

    文本文件读文件

    文本文件读文件需要创建ifstream的流对象。

    需要读文件时,在打开文件后通常需要判断是否打开成功,用流对象的is_open函数判断,true为成功,false为失败。

    读文件最后也需要关闭文件。

    读文件有四种方式。下面一一表示。

    可以创建一个char类型数组,然后通过流对象 >> 数组名的方式读入。这种方式遇到空格,换行等会停止读入,可以通过while循环令其一直读入,只要不到文件末尾则一直为true。

    1. #include
    2. #include
    3. using namespace std;
    4. int main(void)
    5. {
    6. ifstream ifs;
    7. ifs.open("test.txt", ios::in);
    8. if (!ifs.is_open()) {
    9. cout << "ERROR" << endl;
    10. return 1;
    11. }
    12. char ch[1000];
    13. while (ifs >> ch) {
    14. cout << ch << endl;
    15. }
    16. ifs.close();
    17. return 0;
    18. }

    这段代码创建了char类型的数组ch,并且只要不到文件末尾就一直读入,读后在循环内输出。

    程序的输出是:

    Hello
    world
    Hello
    C++

    文件内容就是上面写入的内容,没有修改。

    也可以通过流对象的getline函数进行读文件操作。该函数有两个参数,第一个是一个char类型指针,第二个是第一个参数的大小。一次读取一行内容,并且在不到文件末尾时,结果都是true。

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. int main(void)
    6. {
    7. ifstream ifs;
    8. ifs.open("test.txt", ios::in);
    9. if (!ifs.is_open()) {
    10. cout << "ERROR" << endl;
    11. return 1;
    12. }
    13. char ch[1000];
    14. while (ifs.getline(ch, sizeof(ch))) {
    15. cout << ch << endl;
    16. }
    17. ifs.close();
    18. return 0;
    19. }

    这段代码创建了一个char类型数组ch。然后进行while循环,只要不到文件末尾就一直用getline进行读入,随后在循环体中进行输出。

    程序的输出是:

    Hello world
    Hello C++
    文件内容就是上面写入的内容,没有修改。

    string头文件的函数getline也可以进行读入,有两个参数,第一个是一个ifstream流对象,第二个是一个string类型对象。如果不到文件末尾则结果为true。

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. int main(void)
    6. {
    7. ifstream ifs;
    8. ifs.open("test.txt", ios::in);
    9. if (!ifs.is_open()) {
    10. cout << "ERROR" << endl;
    11. return 1;
    12. }
    13. string str;
    14. while (getline(ifs, str)) {
    15. cout << str << endl;
    16. }
    17. ifs.close();
    18. return 0;
    19. }

    程序中使用while循环进行读入,在循环体内输出。

    程序的结果是:

    Hello world
    Hello C++

    文件内容就是上面写入的内容,没有修改。

    ifstream流对象有一个没有参数的get函数,读取下一个字符,并将其结果返回。如果到达文件结尾,则返回EOF。EOF表示文件结尾。

    1. #include
    2. #include
    3. using namespace std;
    4. int main(void)
    5. {
    6. ifstream ifs;
    7. ifs.open("test.txt", ios::in);
    8. if (!ifs.is_open()) {
    9. cout << "ERROR" << endl;
    10. return 1;
    11. }
    12. char ch;
    13. while ((ch = (ifs.get())) != EOF){
    14. cout << ch;
    15. }
    16. ifs.close();
    17. return 0;
    18. }

    程序创建了一个char类型变量ch,随后使用while循环进行不断读入,至文件末尾为止。循环体内输出ch。程序的结果是:

    Hello world
    Hello C++

    文件内容就是上面写入的内容,没有修改。

    二进制文件写文件

    二进制文件读写操作都要指定ios::binary

    二进制文件写文件主要用流对象调用成员函数write,write函数的原型是:

    ostream& write (const char * buffer,int len)

    buffer指向内存的一块空间,len是读写的字节数量。

    1. #include
    2. #include
    3. using namespace std;
    4. class person {
    5. public:
    6. char name[20];
    7. int age;
    8. };
    9. int main(void)
    10. {
    11. ofstream ofs;
    12. ofs.open("testbinary.txt", ios::binary | ios::out);
    13. person p = { "Linda",24 };
    14. ofs.write((const char*)&p, sizeof(p));
    15. ofs.close();
    16. return 0;
    17. }

    程序中有person类,其成员为一个char类型数组和一个int类型变量。(这里处理字符串时不要用string,因为string的一些特性会造成问题)程序创建了一个person类对象p,并将其写入文件。写的时候将地址强制类型转换成了const char类型。

    程序无输出,文件中有内容(但是无法读懂)。

    二进制文件读文件

    二进制读文件主要调用成员函数read。函数原型是:

    istream& read(char *buffer,int len)

    buffer指向一块空间,len是读入的字节数。

    1. #include
    2. #include
    3. using namespace std;
    4. class person
    5. {
    6. public:
    7. char name[20];
    8. int age;
    9. };
    10. int main(void)
    11. {
    12. ifstream ifs;
    13. ifs.open("testbinary.txt", ios::binary | ios::in);
    14. if (!ifs.is_open()) {
    15. cout << "ERROR" << endl;
    16. return 1;
    17. }
    18. person p;
    19. ifs.read((char*)&p, sizeof(p));
    20. cout << "The name is " << p.name << endl;
    21. cout << "The age is " << p.age << endl;
    22. ifs.close();
    23. return 0;
    24. }

    程序创建了一个person类和一个类对象。随后读入数据并进行输出。在读入时将指针强制转换为char*类型。

    程序的输出是:

    The name is Linda
    The age is 24

    类的内容和上面读入的一致。

  • 相关阅读:
    SLAM从入门到精通(里程计的计算)
    laravel-admin联动选择展示时ueditor样式错乱
    人工智能对我们的生活影响有多大
    关于虚拟机中IPI中断的思考
    oj渊子赛马——贪心算法
    《网络通信编程》教学大纲
    我用Python写了几个摸鱼小游戏,赐你2023年度上班上学摸鱼必备良品!(附源码)
    “权限之舞:Linux安全之道”
    低代码维格云甘特视图入门教程
    【面试题】数组去重的五种方法(必会)
  • 原文地址:https://blog.csdn.net/m0_71007572/article/details/126358428