1 文件概述
文件是指一组相关数据的有序集合,这个数据集的名称叫做文件名。文件通常是驻留在外部介质(如磁盘等)上的,在使用时才调入内存中来,这就是为什么对文件操作时需要打开和关闭的原因。
根据数据的存储方式,文件可以分为二进制文件和文本文件。二进制文件直接存储二进制数据,可以节省外存空间和转换时间,但一个字节并不对应一个字符,不能直接输出字符形式。文本文件是以二进制字符编码形式存储信息的文件,常用的字符编码如ASCII码、Unicode码等。文本文件便于对字符进行逐个处理,也便于输出字符。
在C++中,对文件的操作通常需要使用文件流,包括输入文件流(ifstream)和输出文件流(ofstream)。通过这些文件流,可以打开、关闭文件,读取、写入文件内容,以及进行文件指针定位等操作。
此外,C++还提供了一些文件操作相关的类和函数,如文件流类(fstream)、文件操作函数(如fopen、fclose、fread、fwrite等),以及文件状态检查函数(如feof、ferror等),方便进行文件操作和管理。
2 文件输入操作
文件输入操作涉及到从外部文件中读取数据,并将其用于程序中的进一步处理。整个过程通常包括打开文件、读取文件内容、处理读取的数据,并在完成后关闭文件。
文件输入操作主要步骤包括:
-
读取文件内容: 有多种方法可以从文件中读取数据,读取方式包括以下几种:
-
逐行读取:使用
std::getline()
函数从文件中逐行读取文本。 -
读取格式化数据:使用
>>
运算符读取格式化数据,如整数、浮点数或字符串。
-
-
处理读取的数据: 在读取数据后,可以根据需要对数据进行处理。这可能包括解析数据、执行计算、更新程序状态等。
-
关闭文件: 完成文件读取后,使用
close()
成员函数关闭文件。关闭文件是一个好习惯,它可以释放系统资源,并确保所有待处理的输入/输出操作都已完成。 -
错误处理: 在读取文件时,可能会遇到各种错误,如文件不存在、读取权限不足、文件格式错误等。你应该准备好处理这些错误,以确保程序的健壮性。
#include <iostream>
#include <fstream>
#include <string>int main()
{// 创建并尝试打开文件std::ifstream inputFile("example.txt"); // 检查文件是否打开if (!inputFile.is_open()) {std::cerr << "文件打开失败!" << std::endl;return 1;}std::string line;while (std::getline(inputFile, line)) { // 逐行读取文件// 输出到控制台std::cout << line << std::endl; }// 文件关闭inputFile.close();return 0;
}
3 文件输出操作
文件输出操作在C++中通常涉及到使用<fstream>
库中的ofstream
类。ofstream
代表输出文件流,用于将数据写入到文件中。
文件输入操作主要步骤包括:
-
打开文件: 使用
open()
成员函数打开文件,准备写入数据。需要提供文件的路径作为参数。如果文件不存在,它将被创建;如果文件已存在,其内容将被覆盖,除非以追加模式打开文件。 -
关闭文件: 完成文件写入后,使用
close()
成员函数关闭文件。关闭文件是一个好习惯,它可以释放系统资源,并确保所有待处理的输入/输出操作都已完成。
#include <iostream>
#include <fstream>
#include <string>int main()
{// 定义输出文件流对象std::ofstream outputFile;// 打开文件,准备写入。如果文件不存在,则创建它。outputFile.open("example.txt");// 检查文件是否成功打开if (!outputFile.is_open()) {std::cerr << "文件打开失败." << std::endl;// 返回错误代码return 1; }// 写入数据到文件outputFile << "This is a test file." << std::endl;outputFile << "Here is some more text." << std::endl;// 也可以写入变量int number = 123;outputFile << "变量number: " << number << std::endl;// 关闭文件outputFile.close();// 可以在关闭文件后检查是否成功关闭if (outputFile.fail()) {std::cerr << "文件关闭异常,请检查!" << std::endl;return 1;}std::cout << "文件写入成功!" << std::endl;return 0;
}
其中,文件打开模式包括:
打开模式 | 描述 |
---|---|
std::ios::in | 打开文件进行读取操作。这是std::ifstream 的默认模式。 |
std::ios::out | 打开文件进行写入操作。如果文件已存在,内容可能会被清空(除非同时指定了std::ios::app )。这是std::ofstream 的默认模式。 |
std::ios::app | 所有写入操作在文件末尾执行,保留文件中已存在的数据。 |
std::ios::ate | 打开文件后立即将读写位置定位到文件末尾。常与std::ios::in 结合使用以访问已存在文件的数据。 |
std::ios::trunc | 如果文件已存在,并且是以输出模式(std::ios::out )打开,则删除文件内容。通常不需要显式指定,因为std::ios::out 模式默认会清空文件。但如果同时指定了std::ios::app ,则不会清空文件内容。 |
std::ios::binary | 以二进制模式打开文件,不进行文本转换。适用于非文本文件(如图像、音频等)。 |
注意,如果未明确指定模式,则std::ifstream
将默认使用std::ios::in
,而std::ofstream
将默认使用std::ios::out
。如果需要对文件进行读取和写入操作,则应该使用std::fstream
,并明确指定所需的模式。