C++文件的 I/O 操作

在C++中,文件的I/O(输入/输出)操作主要通过文件流(file streams)来实现。C++标准库提供了三种文件流类:std::ifstream用于输入(读取)文件,std::ofstream用于输出(写入)文件,而std::fstream则同时支持输入和输出操作。

打开文件

在进行文件I/O操作之前,首先需要打开一个文件。这可以通过文件流对象的open成员函数来完成,或者在构造文件流对象时直接指定文件名。

std::ifstream inFile("input.txt"); // 尝试打开名为"input.txt"的文件进行读取  
std::ofstream outFile("output.txt"); // 尝试打开名为"output.txt"的文件进行写入

如果文件成功打开,则可以继续进行I/O操作。如果文件打开失败(例如,文件不存在或没有适当的权限),则文件流对象会进入失败状态,可以通过检查流的状态来确定是否成功打开了文件。

读取文件

使用std::ifstream对象可以读取文件的内容。常见的读取操作包括使用提取操作符(>>)读取格式化数据,以及使用std::getline或read成员函数读取行或原始数据。

std::string line;  
while (std::getline(inFile, line)) {  
    std::cout << line << std::endl; // 输出读取的每一行  
}
写入文件

使用std::ofstream对象可以向文件写入数据。这通常通过插入操作符(<<)来完成。

outFile << "Hello, World!" << std::endl; // 向文件写入字符串和换行符
关闭文件

完成文件I/O操作后,应该关闭文件以释放资源。这可以通过调用文件流对象的close成员函数来完成。

inFile.close(); // 关闭输入文件  
outFile.close(); // 关闭输出文件

然而,在大多数情况下,当文件流对象超出其作用域并被销毁时,析构函数会自动关闭文件。因此,在局部作用域内声明的文件流对象通常不需要显式调用close。

错误处理

在进行文件I/O操作时,应该始终检查是否发生了错误。这可以通过检查文件流对象的状态来完成。常见的状态检查包括使用fail()、eof()、bad()和good()成员函数。

if (!inFile) {  
    std::cerr << "Failed to open input file." << std::endl;  
    return 1; // 或其他错误处理代码  
}
二进制文件操作

默认情况下,文件流以文本模式打开。要以二进制模式打开文件,可以在文件名后添加std::ios::binary标志。

std::ifstream inFile("binaryfile.bin", std::ios::binary);  
std::ofstream outFile("binaryfile.bin", std::ios::binary);

在二进制模式下,文件的内容会按照原始字节进行读取和写入,而不会进行任何转换(如换行符的转换)。

示例代码:

以下是一个完整的示例,演示了如何打开文件、读取内容、写入新内容并关闭文件:

#include <iostream>  
#include <fstream>  
#include <string>  
  
int main() {  
    // 打开文件进行读取  
    std::ifstream inFile("example.txt");  
    if (!inFile) {  
        std::cerr << "Unable to open input file." << std::endl;  
        return 1;  
    }  
  
    // 读取并输出文件内容  
    std::string line;  
    while (std::getline(inFile, line)) {  
        std::cout << line << std::endl;  
    }  
    inFile.close(); // 关闭输入文件(虽然在这个例子中不是必需的)  
  
    // 打开文件进行写入  
    std::ofstream outFile("example.txt"); // 这将覆盖现有文件的内容  
    if (!outFile) {  
        std::cerr << "Unable to open output file." << std::endl;  
        return 1;  
    }  
  
    // 向文件写入新内容  
    outFile << "This is a new line in the file." << std::endl;  
    outFile.close(); // 关闭输出文件(虽然在这个例子中不是必需的)  
  
    return 0;  
}

请注意,在这个示例中,inFile.close()和outFile.close()的调用实际上是多余的,因为当inFile和outFile对象超出其作用域时,它们的析构函数会自动关闭文件。然而,在某些情况下(如需要在同一个程序中多次打开和关闭同一个文件),显式调用close可能是有益的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值