• 浅谈C++|文件篇


     

     引子:

    程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放通过文件可以将数据持久化。C++中对文件操作需要包含头文件< fstream > 。

    C++提供了丰富的文件操作功能,你可以使用标准库中的fstream库来进行文件的读取、写入和定位等操作。文件操作在许多应用中非常常见,例如读取配置文件、处理日志、存储数据等。

    首先,你需要包含``头文件,然后可以创建不同类型的文件流对象,如ifstream、ofstream和fstream,它们分别用于读取、写入和读写文件。

    对于文件的读取,你可以使用ifstream对象。通过调用`open()`函数并指定文件名,你可以打开一个文件进行读取操作。然后,你可以使用`>>`和其他输入操作符从文件中读取数据,或者使用`getline()`函数逐行读取文件内容。

    对于文件的写入,你可以使用ofstream对象。同样,通过调用`open()`函数并指定文件名,你可以打开一个文件进行写入操作。然后,你可以使用`<<`和其他输出操作符将数据写入文件中。

    除了读取和写入文件,你还可以使用fstream对象进行读写混合的文件操作。例如,你可以使用`seekg()`和`seekp()`函数定位文件指针,以便在文件中进行随机读写操作。`tellg()`和`tellp()`函数可以获取文件指针的当前位置。

    在进行文件操作时,记得检查文件是否成功打开,并确保在不再需要使用文件时关闭它。你可以使用`is_open()`函数检查文件是否成功打开,使用`close()`函数关闭文件。

    除了基本的文件读写操作,C++还提供了其他功能,如二进制文件的读写、文件的追加写入、文件错误处理等。你可以根据具体需求查阅C++的相关文档,深入学习和应用这些功能。

    在进行文件操作时,应注意文件路径的正确性,避免发生文件找不到或无法读取的问题。此外,操作文件时要考虑文件锁定和并发访问等问题,确保线程安全性和资源的正常释放。

    总之,C++的文件操作功能非常强大和灵活,使你能够轻松处理各种文件操作需求。合理运用文件操作,可以简化代码、提高效率,并为数据的存储和管理提供便利。

     

    一.基本知识: 

    1.1文件类型

    文件类型分为两种:
    1.文本文件–文件以文本的ASCII码形式存储在计算机中。
    2二进制文件·文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们。

    1.2操作文件分类 

     操作文件的三大类:

    1. ifstream:读操作     io对应读写

    2.ofstream:写操作

    3. fstream :读写操作

    1.3文件步骤

    1.包含头文件
    #include

    2.创建流对象
    ofstream ofs;

    3.打开文件
    ofs.open("文件路径",打开方式);

    4.写数据
    ofs <<"写入的数据";

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

    1.4文件打开方式

    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. void fun() {
    5. //1.头文件
    6. //2.创建流对象
    7. fstream ofs;
    8. //3.指定打开方式
    9. ofs.open("test.txt", ios::out);
    10. //4.写内容
    11. ofs << "姓名:张三" << endl;
    12. ofs << "性别:男" << endl;
    13. //5.关闭文件
    14. ofs.close();
    15. }
    16. int main() {
    17. fun();
    18. return 0;
    19. }

    写文件可以用ofstream或 fstream 

    读文件代码实例:

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. void fun() {
    6. //1.头文件
    7. //2.创建流对象
    8. fstream ofs;
    9. //3.指定打开方式
    10. ofs.open("test.txt", ios::out);
    11. //4.写内容
    12. ofs << "姓名:张三" << endl;
    13. ofs << "性别:男" << endl;
    14. //5.关闭文件
    15. ofs.close();
    16. }
    17. void fun1() {
    18. ifstream ofs;
    19. ofs.open("test.txt", ios::in);
    20. //ofs.is_open()打开失败返回false
    21. if (!ofs.is_open()) {
    22. cout << "文件打开失败" << endl;
    23. }
    24. //读数据
    25. //
    26. //第一种
    27. char buf[1024] = { 0 };
    28. //ofs按行输入到buf中,每次循环覆盖上一次
    29. while (ofs >> buf) {
    30. cout << buf << endl;
    31. }
    32. //第二种
    33. char buf1[1024] = { 0 };
    34. //和第一种一样,限定最大的大小
    35. while(ofs.getline(buf1, sizeof(buf1)) ){
    36. cout << buf1 << endl;
    37. }
    38. //第三种
    39. string buf2;
    40. //从ofs输入到buf2中
    41. while (getline(ofs, buf2)) {
    42. cout << buf2 << endl;
    43. }
    44. //第四种,不推荐
    45. char c;
    46. while ((c=ofs.get())!=EOF) {
    47. cout << c;
    48. }
    49. ofs.close();
    50. }
    51. int main() {
    52. fun();
    53. fun1();
    54. return 0;
    55. }

    总结:
    ·读文件可以利用ifstream ,或者ftream类

    ·利用is_open函数可以判断文件是否打开成功

    . close关闭文件

    二.二进制读取和写入

    代码实例:

    1. #include
    2. //1.头文件
    3. #include
    4. using namespace std;
    5. class person {
    6. public:
    7. int age;
    8. const char *name; //C++要加const,学到了
    9. };
    10. void fun() {
    11. //2.打开数据流(读写模式)
    12. fstream ofs;
    13. //3.打开文件
    14. ofs.open("erjinzhi.txt", ios::out | ios::binary);
    15. //4.写数据
    16. person p;
    17. p.age = 18;
    18. p.name = "tom";
    19. ofs.write((const char*)&p,sizeof(person));
    20. p.age = 19;
    21. p.name = "tony";
    22. ofs.write((const char*)&p, sizeof(person));
    23. //5.关闭文件
    24. ofs.close();
    25. }
    26. void read() {
    27. //2.打开数据流模式
    28. fstream ofs;
    29. //3.打开文件
    30. ofs.open("erjinzhi.txt", ios::in | ios::binary);
    31. if (!ofs.is_open()) {
    32. cout << "打开失败" << endl;
    33. }
    34. //4.读数据
    35. person p;
    36. ofs.read((char*)&p, sizeof(p));
    37. cout << p.age << endl;
    38. cout << p.name << endl;
    39. ofs.read((char*)&p, sizeof(p));
    40. cout << p.age << endl;
    41. cout << p.name << endl;
    42. ofs.close();
    43. }
    44. int main() {
    45. fun(); //写文件
    46. read();
    47. return 0;
    48. }

    ofs.write((const char*)&p,sizeof(person));

    ofs.open("erjinzhi.txt", ios::in | ios::binary);

    注意这两个函数的用法即可

  • 相关阅读:
    EN 13970防水用柔性薄板—CE认证
    方程求根之二分法
    WordPress多语言翻译插件小语种互译
    Nginx静态资源配置
    springcloud搭建kafka
    美食杰项目(一)登录注册页
    达梦(DM)数据库管理表
    vue前端实现微信支付-微信公众号JSSDK
    【二分查找】【键值皆有序】1840最高建筑高度
    Leetcode力扣 MySQL数据库 1555 银行账户概要
  • 原文地址:https://blog.csdn.net/m0_73731708/article/details/132927585