C++输入输出流 -ios文件操作
输入-输出流:
[TOC]
❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️
1. 写文件
o 首先要使用头文件
#include<fstream>
-
创建流对象
ofstream ofs;
-
指定打开方式
--
可以写绝对路径或者相对路径
ofs.open("test.txt",ios::out);
-
写内容
ofs<<"姓名:"<<endl;
-
关闭文件
ofs.close();
2. 读文件
o 创建流对象
ifstream ifs;
-
打开文件,
判断文件是否打开成功
ifs.open("文件路径",打开方式);
if(!ifs.is_open())
cout<<"文件打开失败"<<endl;
return;
}
-
读数据
四种读取方式
第一种:
char buf[1024] = { 0 };
//定义字符数组
while(ifs >> buf)
cout << buf <<endl;
}
第二种:
char buf[1024] = { 0 };
//getline获取,sizeof统计字符长度
while(ifs.getline(buf,sizeof(buf)))
cout << buf <<endl;
}
第三种
//使用string --需要包含string头文件
while ( getline( ifs,buf ))
cout<< buf <<endl;
}
第四种:不推荐 --依次读取字符
char c;
while (( c=ifs.get())!=EOF)
{ //eof是文件尾部的标志
cout<<c;
}
-
关闭文件
ifs.close();
总结:
\1. 读文件可以使用ifstream,或者fstream类
\2. 利用is_open函数判断文件是否打开成功
\3. close关闭文件
代码:
#include<iostream>
#include<fstream> //包含头文件
using namespace std;
//文本文件 读文件
void test01()
//创建流对象
ifstream ifs;
//打开文件
ifs.open("/c/cpp/tar.cpp",ios::in);
if(!ifs.is_open())
cout<<"文件打开失败"<<endl;
return ;
char buf[1024] = { 0 };
//定义字符数组
while(ifs >> buf)
cout << buf <<endl;
ifs.close(); //关闭文件
int main()
test01();
return 0;
}
3 . 以二进制形式对文件进行读取操作
- 打开的文件会出现乱码
- 也可以通过加密方式保护文件
- 打开方式要指定为 ios::binary
代码:
#include<fstream>
#include<iostream>
using namespace std;
//二进制写文件
class Person
public:
char m_Name[64];
int m_Age;
void test01()
//创建流对象
ofstream ofs;
//打开文件 //用二进制打开方式要指定为 ios::binary
ofs.open("/c/cpp/tar.cpp",ios::out | ios::binary);
//写文件
Person p ={"张三",18};
ofs.write((const char *)&p,sizeop(Person));
//由于&p取地址是person类型,所以要强制转换为char
//关闭文件
ofs.close();
int main()
test01();
return 0;
}
求赞!
查看文件:
由此可见是二进制形式,那么如何把文件读取回来呢?
4 . 文件读取:
读文件用read
\1. 函数原型:
**istream& read(char *buffer,int len);**
\2. 参数解释:字符指针buffer指向内存中一段存储空间。len是读取的字节数
代码:
include<fstream>
include<iostream>
using namespace std;
//读取二进制文件
class Person
public:
char m_Name[64]; //属性姓名
int m_Age; //属性年龄
void test01()
//创建流对象
ifstream ifs; //注意读文件和写文件流对象区别
//打开文件
ifs.open("/c/cpp/tar.cpp",ios::in | ios::binary);
//判断文件是否读入成功 --使用前面讲的方法
if (!ifs.is_open())
cout << "文件打开失败"<<endl;
return ; //不返回
}
//
//读文件 --四种方法选择一种
Person p;
ifs.read((char *)&p,sizeof(Person));
cout <<"姓名:"<<p.m_Name<<"年龄:"<<p.m_Age<<endl;
//由于&p取地址是person类型,所以要强制转换为char
//关闭文件
ifs.close();
int main()
test01();
return 0;
}
5 . 加密解密(c语言实现)
代码:
void myEncodeAnDecode(char prePath[], char resultPath[], int password) {
FILE * normal_fp = fopen(prePath, "rb");
FILE * encode_fp = fopen(resultPath, "wb");
int ch;
while ((ch = fgetc(normal_fp)) != EOF){
fputc(ch ^ password, encode_fp);
fclose(normal_fp);
fclose(encode_fp);
int main() {
char * oriPath = "D:\\picLibrary\\xiaoHuangTu.png";
//原文件,加密后可删除掉,防止别人查看
char * showOthersPath = "D:\\picLibrary\\xiaoHuangEncode.png";
//存放加密的文件,给别人看,别人也看不了的文件
char * newPath = "D:\\picLibrary\\xiaoHuangDecode.png";
//将加密的文件解密出来的文件,可以自己偷偷的查看
myEncodeAnDecode(oriPath, showOthersPath, 100);//密码随便搞个100
myEncodeAnDecode(showOthersPath, newPath, 100);
system("pause");
return 0;
}
5 . 加密解密
基于前面的扩展,使用通讯录管理系统实现联系人的读取、写入
通讯录项目:
需求分析:
###### 问题描述
编写一个简单的通讯录管理程序。通讯录记录有姓名,地址 *(省、市*( 县 *)、街道*) ,电话号码,邮政编码等四项。
###### 基本要求
程序应提供的基本管理功能有:
1) 添加:即增加一个人的记录到通信录中
2) 显示:即在屏幕上显示所有通信录中的人员信息,应能分屏显示。
3) 存储:即将通讯录信息保存在一个文件中。
4) 装入:即将文件中的信息读入程序。
5) 查询:可根据姓名查找某人的相关信息,若找到显示其姓名、地址、电话号码和邮政编码。
6) 修改:可修改一个人的除姓名外其它信息。
###### 测试数据
程序应输入不少于 *10 *个人员的通讯录信息,应考虑到人员可以同名的情况。
实现提示
程序可用一个动态数组来管理人员信息,每个人员的姓名,地址,电话号码和邮政编码用一个类 *Cperson *来实现,用文件实现对数据的存取。
代码:
//封装函数显示该界面 如 void showMenu()
//在main函数中调用封装好的函数
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<string>
#include<fstream> //包含文件头文件
#define FILENAME "/c/cpp/empfile.txt" //文件路径
#define MAX 1000 //定义通讯录的最大用户数量
//保存文件
void sava();
//读取文件
//判断文件受否为空的
bool m_FileIsEmpty;
using namespace std;
struct Person
//设计联系人结构体
string m_Name;
//性别 1:男 2:女
int m_Sex;
int m_Age;
string m_Phone;
string m_Addr;
//邮政编码
string m_Pos;
//设计通讯录结构体
struct Addressbooks
//通讯录中保存的联系人的数组
struct Person personArray[MAX];
//通讯录中当前记录联系人的个数
int m_Size;
//提前声明菜单函数,用背景函数调用菜单函数
void showMenu();
class Color{ //设置通讯录的背景颜色类型 ---将其封装成类
public:
void setColor() //定义颜色函数
int c;
printf("\t\t以下为可选择背景色及字体颜色:\n\n");
printf("\t\t\t1.系统默认\n");
printf("\t\t\t2.白底黑字\n");
printf("\t\t\t3.灰底黑字\n");
printf("\t\t\t4.蓝底黑字\n\n");
printf("\t\t\t0.不选跳出\n\n");
printf("\t\t请输入您选择的序号:");
scanf("%d",&c);
switch(c)
case 1:break;
case 2:system("color F0"); break;
case 3:system("color 70"); break;
case 4:system("color B0"); break;
case 0:break;
default:printf("\n\t\t输入错误,请您重新输入!\n\n");
setColor();
system("cls");
//菜单界面
void showMenu()
cout << "***************************" << endl;
cout << "***** 1、添加联系人 *****" << endl;
cout << "***** 2、显示联系人 *****" << endl;
cout << "***** 3、删除联系人 *****" << endl;
cout << "***** 4、查找联系人 *****" << endl;
cout << "***** 5、修改联系人 *****" << endl;
cout << "***** 6、清空联系人 *****" << endl;
cout << "***** 0、退出通讯录 *****" << endl;
cout << "***** 9、通讯录背景 *****" << endl;
cout << "***************************" << endl;
// 1、添加联系人
void addPerson(struct Addressbooks* abs)
//判断通讯录是否已满
if (abs->m_Size == MAX)
cout << "通讯录已满,无法继续添加!" << endl;
return;
//添加具体联系人
cout << "请输入姓名:" << endl;
string name;
cin >> name;
abs->personArray[abs->m_Size].m_Name = name;
//性别 1:男 2:女
cout << "请输入性别:" << endl;
cout << "1 --- 男" << endl;
cout << "2 --- 女" << endl;
int sex = 0;
while (true)
cin >> sex;
if (sex == 1 || sex == 2)
abs->personArray[abs->m_Size].m_Sex = sex;
break;
cout << "输入有误,请重新输入!" << endl;
cout << "请输入年龄:" << endl;
int age = 0;
cin >> age;
abs->personArray[abs->m_Size].m_Age = age;
cout << "请输入联系电话:" << endl;
string phone;
cin >> phone;
abs->personArray[abs->m_Size].m_Phone = phone;
cout << "请输入家庭住址:" << endl;
string address;
cin >> address;
abs->personArray[abs->m_Size].m_Addr = address;
//邮政编码 ----例如432000
cout << "请输入邮政编码,一共六位" << endl;
string postal; //邮政编码变量
cin >> postal;
abs->personArray[abs->m_Size].m_Pos = postal;
//更新通讯录中的人数
abs->m_Size++;
cout << "添加成功!" << endl;
system("pause"); // 按任意键继续
system("cls"); // 清屏
//2、显示所有联系人
void showPerson(struct Addressbooks* abs)
cout<<"------------联系人列表----------------"
<<endl;
//判断通讯录中人数是否为零
if (abs->m_Size == 0)
cout << "当前记录为空" << endl;
for (int i = 0; i < abs->m_Size; i++)
cout << "姓名:" << abs->personArray[i].m_Name <<"||"<<endl;
cout << "性别:" << (abs->personArray[i].m_Sex == 1 ? "男" : "女") <<"||"<< endl; // 括号,提高三目运算符优先级
cout << "年龄:" << abs->personArray[i].m_Age << "||"<<endl;
cout << "电话:" << abs->personArray[i].m_Phone << "||"<<endl;
cout << "住址:" << abs->personArray[i].m_Addr <<"||"<< endl;
cout << "邮政编码 :" << abs->personArray[i].m_Pos <<"||"<<endl; //显示邮政编码信息
cout<<"--------------------------------------"<<endl;
system("pause"); // 按任意键继续
system("cls"); // 清屏
//3、检测联系人是否存在,若存在,返回联系人所在数组中的下标,若不存在,返回-1
int isExist(struct Addressbooks* abs, string name)
for (int i = 0; i < abs->m_Size; i++)
//找到了用户输入的姓名
if (abs->personArray[i].m_Name == name)
return i;
//遍历结束都没找到用户输入的姓名
return -1;
//3、删除指定联系人
void deletePerson(struct Addressbooks* abs)
cout << "请输入你要删除的联系人:" << endl;
string name;
cin >> name;
int ret = isExist(abs, name); // 外层的的deletePerson中传入的abs已经是指针了,故此处的abs不需要取址!
if (ret != -1) //isExist用来检测联系人是否存在
//找到此人,要进行删除操作
for (int i = ret; i < abs->m_Size; i++) // 从ret开始前移
//数据前移
abs->personArray[i].m_Name = abs->personArray[i + 1].m_Name;
abs->m_Size--; // 更新通讯录中的人员数
cout << "删除成功!" << endl;
cout << "查无此人!" << endl;
//4、查找指定联系人信息
void findPerson(struct Addressbooks* abs)
cout << "请输入你要查找的联系人" << endl;
string name; //定义变量name
cin >> name;
//判断指定的联系人是否存在
int ret = isExist(abs, name);
if (ret != -1)
//找到了用户输入的姓名
cout << "姓名:" << abs->personArray[ret].m_Name <<"||"<<endl;
cout << "性别:" << (abs->personArray[ret].m_Sex == 1 ? "男" : "女") <<"||"<< endl; // 括号,提高三目运算符优先级
cout << "年龄:" << abs->personArray[ret].m_Age << "||"<<endl;
cout << "电话:" << abs->personArray[ret].m_Phone << "||"<<endl;
cout << "住址:" << abs->personArray[ret].m_Addr <<"||"<< endl;
cout << "邮政编码 :" << abs->personArray[ret].m_Pos <<"||"<<endl; //显示邮政编码信息
cout << "查无此人!" << endl;
system("pause");
system("cls");
//5、修改指定联系人的信息
void modifyPerson(struct Addressbooks* abs)
cout << "请输入要修改的联系人" << endl;
string name;
cin >> name;
int ret = isExist(abs, name);
if (ret != -1)
//找到了指定的联系人
cout << "请输入姓名:" << endl;
string name;
cin >> name;
abs->personArray[ret].m_Name = name;
//性别 1:男 2:女
cout << "请输入性别:" << endl;
cout << "1 --- 男" << endl;
cout << "2 --- 女" << endl;
int sex = 0;
while (true)
cin >> sex;
if (sex == 1 || sex == 2)
abs->personArray[ret].m_Sex = sex;
break;
cout << "输入有误,请重新输入!" << endl;
cout << "请输入年龄:" << endl;
int age = 0;
cin >> age;
abs->personArray[ret].m_Age = age;
cout << "请输入联系电话:" << endl;
string phone;
cin >> phone;
abs->personArray[ret].m_Phone = phone;
cout << "请输入家庭住址:" << endl;
string address;
cin >> address;
abs->personArray[ret].m_Addr = address;
//邮政编码的修改
cout << "请输入新的邮政编码:" << endl;
string postal;
cin >> postal;
abs -> personArray[ret].m_Pos = postal;
cout <<"--------------------------------"<<endl;
cout << "修改成功!" << endl;
cout << "查无此人!" << endl;
system("pause");
system("cls");
//6、清空所有联系人
void cleanPerson(struct Addressbooks* abs)
abs->m_Size = 0; // 将当前记录的联系人数量置为0,做逻辑上的清空
cout << "通讯录已清空" << endl;
system("pause");
system("cls");
//通信录文件的读入与存取
class File{
//文件封装类
public:
File *fp; //定义文件指针
int i,No;
float salary;
//文件的打开
fp = fopen("data.csv","r"); //改用读取的形式"r"
if(fp==NULL)
printf("打开成功!");
exit(0); //使用0形式退出,需要包含stdlib头文件
//从文件中读取联系人的基本信息,并且显示出来
void Fileread()
for(i=0;i<5;i++)
fscanf(fp,"%d,%f",&No,&salary);//格式化输出fscanf
printf("%d\t%.2f\n",no,salary);
fclose(fp);
return 0;
int main()
//创建通讯录结构体变量
struct Addressbooks abs;
//初始化通讯录中当前的人员个数
abs.m_Size = 0;
int select = 0; // 创建用户选择输入的变量
Color colA;
colA.setColor(); //调用颜色
while (true)
showMenu();
//菜单调用
cin >> select;
switch (select)
case 1: // 1、添加联系人
addPerson(&abs); // 利用地址传递可以修改实参
break;
case 2: // 2、显示联系人
showPerson(&abs);
break;
case 3: // 3、删除联系人
deletePerson(&abs);
system("pause");
system("cls");
break;
case 4: // 4、查找联系人
findPerson(&abs);
break;
case 5: // 5、修改联系人
modifyPerson(&abs);
break;
case 6: // 6、清空联系人
cleanPerson(&abs);
break;
case 0: // 0、退出通讯录
cout << "---欢迎下次使用---"<<'\t'<<"--good--bye--" << endl;
system("pause"); // 按任意键继续
return 0;
break;
case 9: //9 、设置通讯录的背景 -- 使用C语言的函数,将其封装为类
colA.setColor();
break;
default:
break;