首页 > 编程语言 >C++——文件操作

C++——文件操作

时间:2024-11-03 20:44:21浏览次数:3  
标签:文件 读取 ios C++ 操作 include 指针 inputFile

在C++编程中,文件操作是一个重要的组成部分,它允许程序读取、写入和处理文件数据。为了执行文件操作,C++提供了一系列的类和函数,这些都包含在标准库的<iostream><fstream>头文件中。


目录

一、I/O流

二、文本文件

1.写文件

2.写文件

三、二进制文件

1.二进制读写操作

四、C++的随机读写


一、I/O流

头文件 <fstream>

    C++中把对文件的读写操作都封装在以下类中:

    ofstream 对文件的写操作,继承了ostream类的功能

    ifstream 对文件的读操作,继承了istream类的功能

    fstream  对文件的读写操作,继承了ofstream\ifstream类的功能

二、文本文件

1.写文件

1.包含头文件        #include <fstream>

2.创建流对象        ofstream ofs;

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

        打开方式:

                ios::in        为读文件而打开文件

                ios::out       为写文件而打开文件

                ios::ate        初始位置:文件尾

                ios::app        追加的方式写文件

                ios::trunc        如果文件存在,先删除后创建

                ios::binary        以二进制方式打开文件

                文件打开方式可以配合使用,利用“|”操作符

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

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

2.写文件

1.包含头文件        #include <fstream>

2.创建流对象        ifstream ifs;

3.打开文件并判断文件是否打开成功         ifs.open("文件路径",打开方式);

        判断文件是否打开成功

        a、使用 !类对象名 的方式进行判断

                    if(!ifs){}

                    else    {}

        b、使用 good\fail 成员函数进行判断上一次文件操作是否成功\失败 需要注意返回值

4.读数据

1. 逐行读取:使用 getline

getline 可以逐行读取文本文件的内容,适合读取整行数据。

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main() {
    ifstream inputFile("example.txt"); // 打开文件

    if (!inputFile.is_open()) {
        cout << "无法打开文件" << endl;
        return 1;
    }

    string line;
    while (getline(inputFile, line)) {
        cout << line << endl; // 输出读取的每一行
    }

    inputFile.close(); // 关闭文件
    return 0;
}

CopyInsert

2. 读取一个单词:使用 >> 操作符

可以使用 >> 操作符读取文件中的一个单词(以空格、换行等为分隔符)。

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main() {
    ifstream inputFile("example.txt");

    if (!inputFile.is_open()) {
        cout << "无法打开文件" << endl;
        return 1;
    }

    string word;
    while (inputFile >> word) { // 读取下一个单词
        cout << word << endl; // 输出读取的单词
    }

    inputFile.close();
    return 0;
}

CopyInsert

3. 读取字符:使用 get 方法

可以使用 get 方法逐个读取字符。

#include <iostream>
#include <fstream>

using namespace std;

int main() {
    ifstream inputFile("example.txt");

    if (!inputFile.is_open()) {
        cout << "无法打开文件" << endl;
        return 1;
    }

    char ch;
    while (inputFile.get(ch)) { // 逐个读取字符
        cout << ch; // 输出读取的字符
    }

    inputFile.close();
    return 0;
}

CopyInsert

4. 读取特定数量的字符:使用 read 方法

可以使用 read 方法指定读取特定数量的字符。

#include <iostream>
#include <fstream>

using namespace std;

int main() {
    ifstream inputFile("example.txt", ios::binary); // 以二进制模式打开文件

    if (!inputFile.is_open()) {
        cout << "无法打开文件" << endl;
        return 1;
    }

    char buffer[256];
    while (inputFile.read(buffer, sizeof(buffer))) { // 每次读取256个字节
        cout.write(buffer, inputFile.gcount()); // 输出读取的字符
    }

    inputFile.close();
    return 0;
}

CopyInsert

5. 使用 istreambuf_iterator 读取整个文件

可以通过 istreambuf_iterator 一次性读取整个文件。

#include <iostream>
#include <fstream>
#include <iterator>

using namespace std;

int main() {
    ifstream inputFile("example.txt");

    if (!inputFile.is_open()) {
        cout << "无法打开文件" << endl;
        return 1;
    }

    // 使用迭代器直接输出整个文件内容
    cout << std::istreambuf_iterator<char>(inputFile);
    
    inputFile.close();
    return 0;
}

三、二进制文件

二进制文件打开方式要指定为ios::binary

1.二进制读写操作

    ostream &write(const char *buffer,streamsize num);

             功能:以二进制方式写入文件

             buffer:待写入数据的内存首地址

             num:要写入的字节
            注意:C++中文件I/O流的write只有两种结果,要么num个字节全部写入成功,要么一个都没有写入,只需要使用 good\fail 判断是否写入成功

    istream &read( char *buffer, streamsize num );

          功能:以二进制方式读文件

        buffer:存储数据的内存首地址

        num:要读取的字节数

    streamsize gcount();

        功能:获取上一次读文件操作时读到的字节数

    注意:在以二进制方式读写对象时,对象的成员不应该有指针(以及string)类型,因为在写入时只会写入指针成员变量(地址编号),而下一次读取该指针变量时,该指针所指向的内存极大可能不是指向上次写入时的内存了,因此读到的该编号没意义了

四、C++的随机读写

 C++为文件IO流提供了两套设置文件位置指针的成员函数,目的为了兼容有两个位置指针的操作系统,但是UNIX\Linux和Windows系统底层只有一个位置指针,所以使用哪套都可以

    istream &seekg(off_type offset,ios::seekdir origin);

            功能:通过偏移值+基础位置 设置 输入流位置指针的位置

                offset:偏移量

                 origin:基础位置

                ios::beg    文件开头

                ios::cur    当前位置

                ios::end    文件末尾
    
    istream &seekg(pos_type position );

            功能:通过 绝对位置 设置输入流位置指针的位置

            ostream &seekp( off_type offset,ios::seekdir origin );

            ostream &seekp( pos_type position );

            功能与seekg类似,用哪个都可以

    pos_type tellg();

         功能:获取输入流的位置指针的位置
    pos_type tellp();

            功能:获取输出流的位置指针的位置

    bool eof();

        功能:判断文件的上一次读操作是否从文件末尾开始读,是返回真


    

标签:文件,读取,ios,C++,操作,include,指针,inputFile
From: https://blog.csdn.net/qq_57521032/article/details/143427472

相关文章

  • 使用Markdown编写适用于GitHub的README.md文件的目录结构
    目录顶部1.使用[TOC]自动生成2.VSCode中的插件3.手搓目录目录相关资料本文相关代码一、概述1.1基本概念1.2两种处理模型(1)微批处理(2)持续处理1.3StructuredStreaming和SparkSQL、SparkStreaming关系二、编写StructuredStreaming程序的基本步骤三、输入源3.1File源(1)创建程......
  • 19-操作系统安全保护
    19.1概述1)概念一般来说,操作系统的安全是指满足安全策略要求,具有相应的安全机制及安全功能,符合特定的安全标准,在一定约束条件下,能够抵御常见的网络安全威胁,保障自身的安全运行及资源安全。操作系统的安全可控目标分为两个层面:第一个层面,是指给定一个操作系统,用户能够实现对操......
  • Sigrity Power SI 3D-EM Full Wave Extraction模式如何进行S参数提取和观测3D电磁场和
    SigrityPowerSI3D-EMFullWaveExtraction模式如何进行S参数提取和观测3D电磁场和远场操作指导(三)-去嵌SigrityPowerSI3D-EMFullWaveExtraction模式如何进行S参数提取和观测3D电磁场和远场操作指导(三)-去嵌  SigrityPowerSI如何使用3D-EMFullWaveExtracti......
  • ctf文件上传题小总结与记录
    解题思路:先看中间件,文件上传点(字典扫描,会员中心),绕过/验证(黑名单,白名单),解析漏洞,cms,编辑器,最新cve文件上传漏洞一般危害高先看中间件,看有没有已经公布的漏洞,找文件上传点,试它的验证模式(黑白名单,后缀名,文件类型(MIME),文件头(png等文件有固定文件头))看能不能上传.htaccess文件,将其他......
  • vim使用&核心文件
    1.vi-vim编辑器详解nano,ed....编辑器.vi/vim区别vi系统自带,不需要额外安装,功能少。vim在最小化安装的版本中默认没有,需要额外安装进阶高级快捷键,操作。vim的基本使用vim/Nolen/hh.txt编辑模式:字母“i”进入退出编辑模式:“esc”键:wqwrite(写,保存)quit(退出)......
  • (2)---【C语言】【GL库】【计算机图形学】DEV C++ 平台openGL库 下的画线图案设计 房
     上篇上手实践  运行结果  实现代码#include<windows.h>#include<GL/glut.h>#defineGLUT_DISABLE_ATEXIT_HACK//处理不同系统宏//星状结构函数,添加了几何中心坐标,半径,叶片宽度占比,叶片数量--------------------------------//绘制内部星状结构基本元素的......
  • JavaScript的DOM操作
    JavaScript的DOM(DocumentObjectModel,文档对象模型)是一种用于表示和操作HTML或XML文档的编程接口。DOM将整个文档建模为一个由节点和对象组成的树结构,使得开发者可以通过JavaScript来访问和修改文档的内容、结构和样式。一、DOM节点DOM节点指的是文档对象模型(DOM......
  • 【国产化替换】信创操作系统:银河麒麟桌面操作系统V10SP1-2403-X86上安装和使用Wiresha
    https://mp.weixin.qq.com/s/cDPN024RaavRcyedGtKYGg信创操作系统:银河麒麟桌面操作系统V10SP1-2403-X86上安装和使用Wireshark网络协议分析器的详细步骤原创易联无界一、引言1.1文档概述Wireshark适用于所有主流Linux发行版,是一款自由开源的网络协议分析器,通过使用Wi......
  • C++模板元编程 实测2
    第一章习题5:使用SFINAE构造一个元函数:输入一个类型T,当T存在子类型type时该元函数返回true,否则返回false。copilot给出的答案是//检测嵌套类型type存在的版本template<typenameT>autohas_type_impl(int)->decltype(std::declval<typenameT::type>(),std::true_type{})......
  • C++ ---STL中的string类的使用
    前言这篇文章主要介绍了关于C++STL库中string类的一些常见的一些接口和使用方法。1.标准库中的string类1.1了解string类1.string是表示字符串的字符串类2.该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。3.string在底层实际是:bas......