您的位置:

C++写文件全面指南

一、文件的基础操作

文件是一种存储数据的容器,通常用于长期保存程序的重要数据。C++标准库提供了一组简单而易用的函数来实现文件的读写操作。文件操作主要包括打开文件、读取文件、写入文件和关闭文件4个步骤。

1.文件打开

在进行文件读写操作前,必须先打开文件。C++标准库提供了fstream头文件,其中的fstream类就具有打开文件的功能。打开文件的方式有两类:二进制模式和文本模式(默认为文本模式),可以通过打开方式的第二个参数来指定。

#include <fstream>
using namespace std;

int main()
{
    fstream file; // 声明一个fstream对象
    file.open("test.txt", ios::in | ios::out | ios::trunc); 
    // 打开文件test.txt,若文件不存在则创建新文件,同时可读写文件
    if (!file) // 判断文件是否打开成功
    {
        cout << "open failed." << endl;
        return 0;
    }
    return 0;
}

2.文件读取

文件读取有两种方法:字符读取和行读取。其中,字符读取使用get函数,行读取使用getline函数。

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main()
{
    ifstream file("test.txt"); // 打开文件test.txt
    string line;
    while (getline(file, line)) // 按行读取文件
    {
        cout << line << endl;
    }
    char ch;
    while (file.get(ch)) // 按字符读取文件
    {
        cout << ch;
    }
    file.close(); // 关闭文件
    return 0;
}

3.文件写入

文件写入使用put函数和write函数。put函数用于像文件中写入一个字符,write函数将一段数据写入到文件中。

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    ofstream file("test.txt");
    file.put('A'); // 向文件写入字符A
    char str[] = "Hello World!";
    file.write(str, sizeof(str)); // 向文件写入字符串Hello World!
    file.close();
    return 0;
}

4.文件关闭

文件关闭使用close函数,调用close函数后,文件被释放并从内存中删除。

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    ofstream file("test.txt");
    file << "Hello World!";
    file.close(); // 关闭文件
    return 0;
}

二、文件的其他操作

除了基本的读写操作外,C++标准库还提供了一些文件的其他操作,包括文件长度、文件指针位置、文件复制、文件重命名等。

1.文件长度

获取文件长度使用tellg函数和seekg函数,tellg函数返回当前文件读指针的位置,seekg函数用于设置文件读指针的位置。

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    ifstream file("test.txt");
    file.seekg(0, ios::end); // 将读指针设置到文件末尾
    int length = file.tellg(); // 获取文件长度
    cout << length << endl;
    file.close();
    return 0;
}

2.文件指针位置

获取文件指针位置使用tellp函数和seekp函数,同样是用来操作文件读写指针的。

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    ofstream file("test.txt");
    file << "Hello World!";
    file.seekp(0, ios::beg); // 将写指针设置到文件开始位置
    file << "h"; // 写入新的字符
    file.close();
    return 0;
}

3.文件复制

文件复制使用fstream和streambuf两个类,其中fstream用来打开复制的文件,streambuf用来读取原文件并写入新文件。

#include <iostream>
#include <fstream>
#include <streambuf>
using namespace std;

int main()
{
    fstream file1("test1.txt", ios::in | ios::binary);
    fstream file2("test2.txt", ios::out | ios::binary);
    file2 << file1.rdbuf(); // 将file1的读取缓冲区写入file2
    file1.close();
    file2.close();
    return 0;
}

4.文件重命名

文件重命名使用rename函数,可以将一个文件重命名为另一个文件名。

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    rename("test1.txt", "test2.txt"); // 将test1.txt重命名为test2.txt
    return 0;
}

三、代码示例

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main()
{
    // 文件打开
    fstream file("test.txt", ios::in | ios::out | ios::trunc);
    if (!file)
    {
        cout << "open failed." << endl;
        return 0;
    }

    // 文件读取
    string line;
    while (getline(file, line))
    {
        cout << line << endl;
    }
    char ch;
    while (file.get(ch))
    {
        cout << ch;
    }

    // 文件写入
    file.put('A');
    char str[] = "Hello World!";
    file.write(str, sizeof(str));

    // 文件长度
    file.seekg(0, ios::end);
    int length = file.tellg();
    cout << length << endl;

    // 文件指针位置
    file.seekp(0, ios::beg);
    file << "h";

    // 文件复制
    fstream file1("test1.txt", ios::in | ios::binary);
    fstream file2("test2.txt", ios::out | ios::binary);
    file2 << file1.rdbuf();
    file1.close();
    file2.close();

    // 文件重命名
    rename("test1.txt", "test2.txt");

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