文件处理
我们做的很多项目都需要用到文件处理
这个项目是对文件创建写入编辑等功能做的一个小deom
其中设计到类的使用具体功能有写入文件 读文件内容 统计文件中行数,大写字母个数,数字个数
创建文件处理类
私有成员与公有成员
私有成员是不可被外部直接调用修改的成员
公有成员是可以直接被外部使用的成员
一般类的属性我们都设置为私有提高安全性
可以在类内部添加修改类属性的方法外部通过调用方法实现修改属性的操作
关于键盘输入
cin只接受字符 如果第一个字符是分隔符则会一直等待接收字符当接收到字符后后面的分隔符会停留在缓存区导致出现问题
当我们需要输入一行数据时推荐使用getline(cin,str)方法此方法在我们输入完成按下回车后将回车字符也读入。
当我们使用cin时则最好在该语句下添加cin.ignore()清除缓存区
文件流
C++ 通过以下几个类支持文件的输入输出:
ofstream: 写操作(输出)的文件类 (由ostream引申而来)
ifstream: 读操作(输入)的文件类(由istream引申而来)
fstream: 可同时读写操作的文件类 (由iostream引申而来)
打开文件(Open a file)
对这些类的一个对象所做的第一个操作通常就是将它和一个真正的文件联系起来,也就是说打开一个文件。被打开的文件在程序中由一个流对象(stream object)来表示 (这些类的一个实例) ,而对这个流对象所做的任何输入输出操作实际就是对该文件所做的操作。
要通过一个流对象打开一个文件,我们使用它的成员函数open():void open (const char * filename, openmode mode);
这里filename 是一个字符串,代表要打开的文件名,mode 是以下标志符的一个组合:
ios::in 为输入(读)而打开文件
ios::out 为输出(写)而打开文件
ios::ate 初始位置:文件尾
ios::app 所有输出附加在文件末尾
ios::trunc 如果文件已存在则先删除该文件
ios::binary 二进制方式
这些标识符可以被组合使用,中间以”或”操作符(|)间隔。例如,如果我们想要以二进制方式打开文件"example.bin" 来写入一些数据,我们可以通过以下方式调用成员函数open()来实现:ofstream file;
file.open (“example.bin”, ios::out | ios::app | ios::binary);
ofstream, ifstream 和 fstream所有这些类的成员函数open 都包含了一个默认打开文件的方式,这三个类的默认方式各不相同: 类 参数的默认方式
ofstream ios::out | ios::trunc
ifstream ios::in
fstream ios::in | ios::out
当我们使用文件时可以直接创建流对象列如:
fstream out(dataName, ios::_Nocreate | ios::app);//打开文件如果不存在不会创建
ofstream out(dataName);//创建文件
ifstream in(dataName);//以输出方式打开文件
当我们使用完流对象后要记得使用 close() 方法关闭流
实例
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include "文件处理.h"
using namespace std;
class fileHandling {//文件处理类
private:
int count=0;//文件行数
int letCount=0;//文件大写字母个数
int numCount=0;//文件数字个数
string dataName;//文件名
vector<string> v1;//工具容器
string str;//工具字符串
public:
fileHandling(string dataName) {//构造函数
this->dataName = dataName;
}
void outFile() {//写文件
fstream out(dataName, ios::_Nocreate | ios::app);//打开文件如果不存在不会创建
if (!out) {
ofstream out(dataName, ios::app);//创建文件
if (out) {
cout << "文件创建成功!" << endl;
cout << "请写入信息:" << endl;
}
}
cout << "是否写入信息?Y/N" << endl;
char s;
cin >> s;
cin.ignore();//消除缓存区回车字符
if (s == ('Y' || 'y')) {
cout << "请写入信息:" << endl;
getline(cin, str);
out << str << endl;
out.close();
}
}
void inFile() {//读文件并统计
ifstream in(dataName);//以输出方式打开文件
if (!in) {
cout << "文件打开失败!" << endl;
}
while (getline(in, str)) {
count++;
cout << "第" << count << "行:" + str << endl;
v1.push_back(str);
for (char s : str) {
if (s >= '0' && s <= '9')
numCount++;
else if (s >= 'A' && s <= 'Z')
letCount++;
}
}
cout << "行数:" << count << "大写字母数:"<<letCount<<"数字数:"<<numCount<<endl;
in.close();
}
void delFile() {//删除文件选中行
cout << "请输入删除第几行内容" << endl;
int a;
cin >> a;
cin.ignore();
if (a > count) {
cout << "没有此行!"<<endl;
}
else {
auto p = v1.begin();
v1.erase(p + a - 1);
ofstream out2(dataName, ios::out);
for (auto i : v1)
{
out2 << i;
}
out2.close();
}
}
};
int main()
{
string dataName = "data.txt";
fileHandling fH(dataName);
int flag=0;//选项
while (flag < 4) {
cout << "1:写文件" << endl;
cout << "2:读文件" << endl;
cout << "3:删除文件中某行" << endl;
cout << "4:退出" << endl;
cin >> flag;
cin.ignore();
switch (flag) {
case 1:fH.outFile(); break;
case 2:fH.inFile(); break;
case 3:fH.delFile(); break;
default:cout << "退出!" << endl; break;
}
}
return 0;
}