自学内容网 自学内容网

C++——文件操作

在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();

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


    


原文地址:https://blog.csdn.net/qq_57521032/article/details/143427472

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!