一文详解C++中打开文件的多种方式及相关流类

2025-08-24 296907 日常编程

在 C++ 中,打开文件可以通过多种流类实现,每种方式都有其特定的用途和特点,这篇文章将为大家详细介绍一下它们的具体使用,感兴趣的小伙伴可以了解下

目录
  • 前言
  • 1. 使用标准文件流类()
    • 1.1ofstream- 输出文件流(写入)
    • 1.2ifstream- 输入文件流(读取)
    • 1.3fstream- 双向文件流(读写)
  • 2. 使用 C 风格文件操作()
    • 3. 使用文件描述符(POSIX/unistd.h)
      • 4. 使用内存映射文件(高级方式)
        • 5. 文件打开模式详解
          • 5.1 C++ 流打开模式(位掩码组合)
          • 5.2 C 风格打开模式
        • 6. 不同方式的比较
          • 7. 最佳实践建议
            • 8. 高级用法示例
              • 8.1 同时读写文件
              • 8.2 二进制文件操作

            前言

            打开一个文件的方式都有哪些,都可以通过哪些流来获取它?

            在 C++ 中,打开文件可以通过多种流类实现,每种方式都有其特定的用途和特点。以下是详细的分类和说明:

            1. 使用标准文件流类()

            1.1ofstream- 输出文件流(写入)

            #include 
            
            // 方式1:构造函数直接打开
            std::ofstream outFile1("output.txt"); // 默认模式:ios::out | ios::trunc
            
            // 方式2:先创建后打开
            std::ofstream outFile2;
            outFile2.open("output.txt", std::ios::app); // 追加模式
            
            // 写入数据
            outFile1 << "Hello World" << std::endl;

            1.2ifstream- 输入文件流(读取)

            #include 
            
            // 方式1:构造函数直接打开
            std::ifstream inFile1("input.txt"); // 默认模式:ios::in
            
            // 方式2:先创建后打开
            std::ifstream inFile2;
            inFile2.open("input.txt");
            
            // 读取数据
            std::string line;
            while (std::getline(inFile2, line)) {
                std::cout << line << std::endl;
            }

            1.3fstream- 双向文件流(读写)

            #include 
            
            // 读写模式
            std::fstream ioFile("data.txt", std::ios::in | std::ios::out);
            
            // 读写二进制文件
            std::fstream binFile("data.bin", 
                                std::ios::binary | 
                                std::ios::in | 
                                std::ios::out);

            2. 使用 C 风格文件操作()

            #include 
            
            // 打开方式
            FILE* file = fopen("file.txt", "r"); // 读取
            FILE* file = fopen("file.txt", "w"); // 写入(清空)
            FILE* file = fopen("file.txt", "a"); // 追加
            FILE* file = fopen("file.bin", "rb"); // 二进制读取
            
            if (file != nullptr) {
                // 使用文件...
                fclose(file); // 必须手动关闭
            }

            3. 使用文件描述符(POSIX/unistd.h)

            #include 
            #include 
            
            int fd = open("file.txt", O_RDONLY); // 只读
            int fd = open("file.txt", O_WRONLY | O_CREAT, 0644); // 写入+创建
            
            if (fd != -1) {
                char buffer[1024];
                read(fd, buffer, sizeof(buffer));
                close(fd); // 必须手动关闭
            }

            4. 使用内存映射文件(高级方式)

            #include 
            #include 
            #include 
            
            int fd = open("largefile.bin", O_RDONLY);
            void* mapped = mmap(nullptr, file_size, PROT_READ, MAP_PRIVATE, fd, 0);
            
            // 使用映射的内存区域...
            munmap(mapped, file_size);
            close(fd);

            5. 文件打开模式详解

            5.1 C++ 流打开模式(位掩码组合)

            模式标志 描述
            std::ios::in 读取模式
            std::ios::out 写入模式
            std::ios::app 追加写入
            std::ios::ate 打开后定位到文件末尾
            std::ios::trunc 如果文件存在则清空
            std::ios::binary 二进制模式

            5.2 C 风格打开模式

            模式 描述
            "r" 只读
            "w" 只写(创建/清空)
            "a" 追加写入
            "r+" 读写
            "w+" 读写(创建/清空)
            "a+" 读和追加

            6. 不同方式的比较

            特性 C++ 流 C 文件操作 文件描述符
            面向对象
            类型安全
            自动资源管理
            格式化I/O
            二进制I/O
            低级控制 部分
            跨平台 基本✓
            性能 中等 较高 最高

            7. 最佳实践建议

            常规文本文件操作:优先使用 C++ 文件流(fstream/ofstream/ifstream

            高性能需求:考虑使用 C 风格文件操作或文件描述符

            二进制文件:总是使用 std::ios::binary 标志

            资源管理:使用 RAII 原则,推荐 C++ 流自动管理资源

            错误检查:始终检查文件是否成功打开

            std::ofstream file("data.txt");
            if (!file.is_open()) {
                // 错误处理
            }

            8. 高级用法示例

            8.1 同时读写文件

            std::fstream file("data.txt", 
                             std::ios::in | 
                             std::ios::out |
                             std::ios::ate); // 打开并定位到末尾
            
            if (file) {
                // 读取当前位置
                std::streampos endPos = file.tellg();
                
                // 回到开头读取
                file.seekg(0);
                std::string content;
                std::getline(file, content);
                
                // 写入新数据
                file << "\nNew data appended";
            }

            8.2 二进制文件操作

            struct Record {
                int id;
                char name[50];
                double value;
            };
            
            // 写入二进制
            std::ofstream binOut("data.bin", std::ios::binary);
            Record rec{1, "Test", 3.14};
            binOut.write(reinterpret_cast(&rec), sizeof(Record));
            
            // 读取二进制
            std::ifstream binIn("data.bin", std::ios::binary);
            Record inRec;
            binIn.read(reinterpret_cast(&inRec), sizeof(Record));

            选择哪种方式取决于具体需求,C++ 文件流提供了最安全和方便的方式,而 C 风格和文件描述符则提供了更多的控制和更高的性能。

            到此这篇关于一文详解C++中打开文件的多种方式及相关流类的文章就介绍到这了,更多相关C++打开文件内容请搜索就爱读以前的文章或继续浏览下面的相关文章希望大家以后多多支持就爱读!

            您可能感兴趣的文章:

            • 浅析C++中的多态与文件操作
            • C++利用PCL点云库操作txt文件详解
            • C++基于LINUX的文件操作
            • C++中文件操作基础详解
            • C++程序操作文件对话框的方法
            • C++文件读写操作详解
            • C++文件流读写操作详解

            Pandas DataFrame.info() 方法的返回值与正确使用方式详解

            DataFrame.info()是一个用于打印数据框结构信息的诊断方法,它不返回任何值(即返回None),因此直接赋值会导致变量为None;若需捕获信息内容,应改用df.info(verbose=True,memory_usage=True)的输出重定向或df.dtypes,df.shape等显式属性。 ```dataframe.info()```是一个用于打印数据框结构信息的诊断方法,它不返回任...

            Python子类如何调用父类方法_详解super函数在多重继承中的应用

            super()是Python多重继承中确保MRO正确执行的必需机制,所有参与类必须统一使用,否则链式调用会静默中断;其三种写法各适配不同上下文,而显式父类调用仅适用于绕过MRO的特定场景。 super()是Python中调用父类方法的推荐方式,尤其在多重继承场景下,它能避免重复调用、保证方法解析顺序(MRO)正确。直接用ParentClass.method(self)看似简单,但容易在菱形继承中出...

            为什么Python中NumPy的运算速度比原生List快_详解向量化计算与C底层原理

            NumPy运算更快的关键在于绕过Python解释器开销、使用连续内存与向量化指令,而非单纯“用了C”;小数组易受缓存未命中和初始化开销影响,需保持数据连续、类型单一、操作可并行。 NumPy运算比Python原生list快,不是因为“它用了C”,而是因为它绕过了Python解释器的运行时开销,并把计算压进连续内存+向量化指令这一条高效通路里。小数组( 为什么np.array([1,2,3])+np...

            Python数据标准化用哪个方案好_StandardScaler与MinMaxScaler详解

            StandardScaler不适用于明显偏态或含大量异常值的数据,因其依赖的均值和标准差易被离群点污染,导致正常数据被压缩到极窄范围,影响模型性能;必须训练集fit_transform、测试集transform,避免数据泄露。 StandardScaler什么时候不能用 当你的数据明显偏离正态分布,或者存在大量异常值时,StandardScaler的效果会变差。它依赖均值和标准差,而这两个统计量本...

            Python 中整数除法的多种实现方式及其适用场景

            本文详解Python中int(x/y)与x//y在语义、精度、性能和边界行为上的本质差异,指出二者结果并不等价,并系统对比其适用场景,同时介绍位运算等高效替代方案。 本文详解python中`int(x/y)`与`x//y`在语义、精度、性能和边界行为上的本质差异,指出二者结果并不等价,并系统对比其适用场景,同时介绍位运算等高效替代方案。 在Python中,看似都能“取整除结果”的int(x/y)和...

            如何在 Excel 文件间准确复制富文本(含多种颜色、格式)内容

            本文介绍使用openpyxl库在两个Excel工作簿间完整复制富文本单元格(如红黑混排文字)的正确方法,关键在于启用rich_text=True参数并直接赋值.value,而非手动提取字体/填充属性。 本文介绍使用openpyxl库在两个excel工作簿间完整复制富文本单元格(如红黑混排文字)的正确方法,关键在于启用`rich_text=true`参数并直接赋值`.value`,而非手动提取字体/...

            如何在 Excel 文件间准确复制富文本(含多种颜色、字体样式)

            使用openpyxl复制Excel单元格中的富文本(如红黑混排文字)时,必须启用rich_text=True参数加载源工作簿,否则仅能获取纯文本值,丢失所有内嵌格式;直接赋值.value即可完整保留RichText对象。 使用openpyxl复制excel单元格中的富文本(如红黑混排文字)时,必须启用`rich_text=true`参数加载源工作簿,否则仅能获取纯文本值,丢失所有内嵌格式;直接赋值...

            怎么理解CSS浮动_CSS浮动原理与清除浮动方法详解教程

            浮动通过脱离文档流实现元素左/右对齐,导致父元素高度塌陷;常用清除方法包括clear属性、overflow设置和伪元素clearfix;现代布局中,float仍适用于文本环绕图片等简单场景,而复杂布局推荐使用Flexbox或Grid。 CSS浮动,说白了,就是让一个元素脱离常规的文档流,像浮在水面上一样,沿着其父容器的左侧或右侧移动,直到遇到父容器的边缘或者另一个浮动元素。它最早是为了实现文本环绕...