您的位置:

C++文件读写操作实现指南

一、文件流

C++中文件流分为输入流和输出流,分别对应读和写的操作。文件流操作需要用到头文件 ,其定义了三种基本类型:ifstream(输入流)、ofstream(输出流)和fstream(输入输出流)。与流相关的定义还有open()和close()成员函数,open()函数用于打开文件,而close()函数用于关闭文件。下面的示例代码演示了如何使用文件流实现文件的打开、读取、写入和关闭操作:

#include 
using namespace std;

int main()
{
    char buffer[256];

    // 打开文件
    ifstream fin("input.txt");
    ofstream fout("output.txt");

    // 读取文件内容
    while(fin.getline(buffer, 256))
    {
        // 输出内容到控制台
        cout << buffer << endl;
        // 输出内容到文件
        fout << buffer << endl;
    }

    // 关闭文件
    fin.close();
    fout.close();

    return 0;
}

  

在上面的示例代码中,首先使用ifstream和ofstream定义了两个文件流对象,然后用open()函数分别打开了一个名为input.txt和output.txt的文件。接着使用getline()函数逐行从input.txt中读取内容,并在控制台输出这些内容,并将其写入到output.txt中。最后用close()函数关闭了两个文件流对象。

二、文件读取

在C++中可以使用ifstream或者fstream打开文件进行读取操作。当使用ifstream打开文件时,只能进行读取操作,而无法进行写入操作。以下示例代码演示了如何使用ifstream进行文件读取:

#include 
using namespace std;

int main()
{
    char buffer[256];
    ifstream fin("input.txt");

    // 判断文件是否打开成功
    if(!fin.is_open())
    {
        cout << "文件打开失败!" << endl;
        return 1;
    }

    // 读取文件内容
    while(fin.getline(buffer, 256))
    {
        // 输出内容到控制台
        cout << buffer << endl;
    }

    fin.close();
    return 0;
}

  

在上述示例代码中,首先使用ifstream定义了一个输入文件流对象fin,并用open()函数打开一个名为input.txt的文件。然后使用getline()函数逐行读取文件内容,并输出到控制台。最后使用close()函数关闭了文件流对象。

三、文件写入

在C++中,可以使用ofstream或者fstream打开文件进行写入操作。当使用ofstream打开文件时,只能进行写入操作,而无法进行读取操作。以下示例代码演示了如何使用ofstream进行文件写入:

#include 
using namespace std;

int main()
{
    char buffer[] = "欢迎来到知乎";
    ofstream fout("output.txt");

    // 判断文件是否打开成功
    if(!fout.is_open())
    {
        cout << "文件打开失败!" << endl;
        return 1;
    }

    // 写入文件内容
    fout << buffer << endl;

    fout.close();
    return 0;
}

  

在上述示例代码中,首先使用ofstream定义了一个输出文件流对象fout,并用open()函数打开一个名为output.txt的文件。然后使用<<运算符将内容写入文件中。而在输入输出流fstream中,同样可以用<<运算符进行文件内容的读取与写入。

四、二进制文件读写

除了常规的文本文件读写,C++还支持二进制文件的读写。在进行二进制文件读写时,需要使用以下函数之一: read()和write()函数。read()函数从文件中读取指定的字节数,并将其存储在指定的缓冲区中。而write()函数将指定的字节数从缓冲区写入到文件中。以下示例代码演示了如何进行二进制文件的读写:

#include 
#include 
   
using namespace std;

int main () 
{
    char data[100];

    // 打开文件
    ofstream fout("file.bin", ios::out | ios::binary); 
    fout.write("Welcome to Zhihu", 17); 

    // 关闭文件
    fout.close();

    // 以二进制格式打开文件
    ifstream fin("file.bin", ios::in | ios::binary); 

    // 读取文件内容
    fin.read(data, 17); 

    // 输出内容到控制台
    cout << data << endl; 

    // 关闭文件
    fin.close();

    return 0;
}

   
  

在上述示例代码中,首先使用ofstream定义了一个输出文件流对象fout,并用open()函数打开一个名为file.bin的文件,打开方式为ios::out | ios::binary,其中ios::out表示以输出方式打开文件,ios::binary表示以二进制方式打开文件。然后使用write()函数写入17个字符到文件中。 接着,用ifstream定义了一个输入文件流对象fin,并用open()函数打开名为file.bin的文件,打开方式为ios::in | ios::binary,其中ios::in表示以输入方式打开文件,ios::binary表示以二进制方式打开文件。然后使用read()函数从文件中读取17个字节的内容,并存储在data缓冲区中。

五、文件位置指针及文件截取

C++中可以使用seekg()函数和seekp()函数控制文件位置指针的位置。get指针指向被读取的下一个字节,而put指针指向将要被写入的下一个字节。另外,还可以用标准库函数函数tellg()和tellp()来实现获取文件位置指针的位置。以下示例代码演示了如何使用seekp()函数截取文件:

#include 
#include 
   
using namespace std;

int main () 
{
    // 打开文件
    ofstream fout("file.txt"); 

    // 写入文件内容
    fout << "Welcome to Zhihu" << endl; 

    // 获取当前文件指针位置
    streampos pos = fout.tellp(); 

    // 移动文件指针到第14个字节处
    fout.seekp(pos-14); 

    // 截取文件
    fout.truncate(pos - 14); 

    // 关闭文件
    fout.close();

    return 0;
}

   
  

在上述示例代码中,首先使用ofstream定义了一个输出文件流对象fout,并用open()函数打开一个名为file.txt的文件。然后使用<<运算符将内容写入文件中。接着,调用tellp()函数获取当前写指针位置,将其存储于pos变量中。然后使用seekp()函数将写指针位置移动到第14个字节前(即最后一个字母“u”处),最后使用truncate()函数截取文件,将文件大小截取至pos - 14个字节。在文件操作结束后,使用close()函数关闭文件流对象。

六、结论

通过本文的讲解,我们可以了解到C++中文件操作的基本原理及常见的文件读写操作。无论是文本文件还是二进制文件,都可以使用不同的文件流进行读写操作。除了常规的读写操作之外,C++还提供了文件位置指针及文件截取的操作,使得文件操作更加灵活方便。