突破编程_C++_基础教程(输入、输出与文件)-4 文件操作

时间:2024-02-17 21:59:21

C++ 的文件操作主要涉及文件的打开、关闭、读取和写入。C++标准库中的 头文件提供了用于文件操作的类,其中 std::ifstream 用于读取文件, std::ofstream 用于写入文件,而 std::fstream 则既可以读取也可以写入文件。
打开文件
在读取或写入文件之前,需要使用相应的文件流对象打开一个文件。可以通过提供文件名来构造一个文件流对象,该对象会在构造时尝试打开文件。如下为样例代码:

#include <fstream>  
#include <iostream>  

int main() {
    // 创建一个用于写入的文件流对象  
    std::ofstream outfile("test.txt");

    // 检查文件是否成功打开  
    if (!outfile) {
        std::cerr << "failed to open the file" << std::endl;
        return 1;
    }

    // 写入一些数据到文件  
    outfile << "hello" << std::endl;

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

    return 0;
}

读取文件
使用 std::ifstream 可以读取文件的内容。可以使用流提取运算符 >> 或 getline 函数来读取数据。如下为样例代码:

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

int main() {
    // 创建一个用于读取的文件流对象  
    std::ifstream infile("test.txt");

    // 检查文件是否成功打开  
    if (!infile) 
	{
        std::cerr << "failed to open the file" << std::endl;
        return 1;
    }

    // 读取文件内容  
    std::string line;
    while (std::getline(infile, line)) 
	{
        std::cout << line << std::endl;
    }

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

    return 0;
}

快速读取大文件
如果需要快速读取一个大文件,则要避免逐行读取或者逐字符读取带来的额外开销。一种快速读取文件的方法是使用文件流的 read 成员函数,它可以一次读取多个字符,这样可以减少系统调用的次数,从而提高读取效率。如下为样例代码:

#include <fstream>  
#include <iostream>  
#include <vector>  

int main() {
    // 打开文件  
    std::ifstream file("large_file.bin", std::ios::binary);

    // 检查文件是否成功打开  
    if (!file)
	{
        std::cerr << "failed to open the file" << std::endl;
        return 1;
    }

    // 获取文件大小  
    file.seekg(0, std::ios::end);
    std::streamsize fileSize = file.tellg();
    file.seekg(0, std::ios::beg);

    // 分配足够的内存来存储文件内容  
    std::vector<char> buffer(fileSize);

    // 读取文件内容到buffer  
    if (!file.read(buffer.data(), fileSize)) 
    {
        std::cerr << "读取文件失败" << std::endl;
        return 1;
    }

    // 在这里处理文件内容,例如可以将其输出到标准输出  
    std::cout.write(buffer.data(), fileSize);

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

    return 0;
}

读写文件
下面是一个同时包含读取和写入操作的示例:

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

int main() {
    // 写入文件  
    std::ofstream outfile("test.txt");
    if (!outfile)
    {
        std::cerr << "failed to open the file" << std::endl;
        return 1;
    }
    outfile << "first line" << std::endl;   //写入第一行
    outfile << "second line" << std::endl;  //写入第二行
    outfile.close();

    // 读取文件  
    std::ifstream infile("test.txt");
    if (!infile) {
        std::cerr << "failed to open the file" << std::endl;
        return 1;
    }
    std::string line;
    while (std::getline(infile, line))
    {
        std::cout << line << std::endl;
    }
    infile.close();

    return 0;
}

文件流的状态
可以使用文件流对象的 is_open() 成员函数来检查文件是否已成功打开。此外,还可以使用 fail() , eof() , 和 bad() 等成员函数来检查流的状态。
文件流的其他操作
clear(): 重置流的状态标志。
seekg() 和 seekp(): 移动文件的读写指针。
tellg() 和 tellp(): 返回文件的读写指针当前位置。
flush(): 清空输出缓冲区,确保所有数据都被写入文件。