一、文件的基础操作
文件是一种存储数据的容器,通常用于长期保存程序的重要数据。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;
}