赞
踩
通过文件可以将数据持久化
C++中对文件操作需要包含头文件 < fstream >
包含头文件
#include <fstream>
创建流对象
ofstream ofs;
打开文件
ofs.open(“文件路径”,打开方式);
文件路径可以直接写个文件名,因为如果不指定路径的话,他会默认在当前项目路径下。
写数据
ofs << “写入的数据”;
类似于cout<<“…”; cout就是往屏幕上输出,而ofs就是往文件里输出
关闭文件,这一步很重要而且容易遗漏
ofs.close();
#include<iostream> using namespace std; #include<string> // 1.包含头文件 fstream #include<fstream> // 文本文件 写文件 void test01() { // 1.包含头文件 // 2.创建流对象 ofstream ofs; // 3.指定打开的方式 //文件名为test.txt ofs.open("test.txt", ios::out); // 4.写内容 ofs << "姓名:张三" << endl << "年龄:19" << endl << "性别:男" << endl; // 5.关闭文件 ofs.close(); } int main() { test01(); cin.get(); return 0; }
总结:
读文件与写文件步骤相似,但是读取方式相对于比较多
读文件步骤如下:
包含头文件
#include <fstream>
创建流对象
ifstream ifs;
打开文件并判断文件是否打开成功
ifs.open(“文件路径”,打开方式);
读数据
四种方式读取
关闭文件,记住别忘了要关闭文件
ifs.close();
判断文件是否打开成功(其实也就是判断有没有这个文件):
if (!ifs.is_open())
{
cout << "文件打开失败" << endl;
return;
}
if_open()是系统自带的布尔类型函数,打开成功返回1
打开失败返回0(这个函数是判断文件是否存在的)
//第一种方式
char buf[1024] = { 0 };//首先初始化字符数组
while (ifs >> buf)
// ifs右移运算符,他会读取数据并放到buf数组中,当数据全部读完后,返回一个false,while循环也就结束了
{
cout << buf << endl;
}
char *str:表示我们要把读取的数据放到哪个地方,一般是个数组
count:所占的空间
//第二种
char buf[1024] = { 0 };
while (ifs.getline(buf,sizeof(buf)))
{
cout << buf << endl;
}
//第三种
string buf;
while (getline(ifs, buf))
{
cout << buf << endl;
}
ifs.get()每次只读一个字符。EOF代表末尾的意思
// 第四种
char c;
while ((c = ifs.get()) != EOF)
{
cout << c;
}
#include<iostream> using namespace std; //1. 包含头文件 #include<fstream> #include<string> void test01() { // 2. 创建流对象 ifstream ifs; //3. 打开文件并判断文件是否打开成功 ifs.open("test.txt", ios::in); if (!ifs.is_open()) { cout << "文件打开失败" << endl; return; } // 4. 读数据 // 四种方式 //第一种方式 //char buf[1024] = { 0 }; //while (ifs >> buf) //{ // cout << buf << endl; //} //第二种 //char buf[1024] = { 0 }; //while (ifs.getline(buf,sizeof(buf))) //{ // cout << buf << endl; //} //第三种 string buf; while (getline(ifs, buf)) { cout << buf << endl; } // 第四种 //char c; //while ((c = ifs.get()) != EOF) //{ //cout << c; //} // 5. 关闭文件 ifs.close(); } int main() { test01(); system("pause"); return 0; }
以二进制的方式对文件进行读写操作
二进制方式写文件主要利用流对象调用成员函数write
函数原型 :ostream& write(const char * buffer,int len);
参数解释:参数一:字符指针常量buffer(也可以理解为就是一段地址(指针就是地址),不过要把它强制转换成const char * ) 。 buffer指向内存中一段存储空间。len是读写的字节数
数组名就可以直接作为参数一,当传数组给一个函数时,数组类型自动转换为指针类型,传的实际是数组元素首地址。
#include<iostream> using namespace std; #include <fstream> #include <string> class Person { public: char m_Name[64]; int m_Age; }; //二进制文件 写文件 void test01() { //1、包含头文件 //2、创建输出流对象 ofstream ofs("person.txt", ios::out | ios::binary|ios::trunc); //3、打开文件 //ofs.open("person.txt", ios::out | ios::binary); int a = 55; int d[20]; for (int i = 0; i < 20; i++) { d[i] = i; } Person p = { "张三" , 18 }; char c[15] = { "Hello,World!" }; //4、写文件 ofs.write((const char*)&a, sizeof(a)); ofs.write((const char*)d, sizeof(c)); ofs.write((const char*)&p, sizeof(p)); ofs.write((const char*)c, sizeof(c)); //5、关闭文件 ofs.close(); } int main() { test01(); system("pause"); return 0; }
二进制文件打开是乱码
二进制方式读文件主要利用流对象调用成员函数read
函数原型:istream& read(char *buffer,int len);
参数解释:参数一:字符指针buffer(也可以理解为就是一段地址(指针就是地址),不过要把它强制转换成 char * ) 。它指向内存中一段存储空间。len是读写的字节数
数组名可以直接作为参数一,当传数组给一个函数时,数组类型自动转换为指针类型,传的实际是数组元素首地址。
#include<iostream> using namespace std; // 1.包含头文件 #include <fstream> #include <string> class Person { public: char m_Name[64]; int m_Age; }; void test01() { // 2.创建流对象的同时打开文件 ifstream ifs("person.txt", ios::in | ios::binary); // 3.判断文件是否打开成功 if (!ifs.is_open()) { cout << "文件打开失败" << endl; } Person p; // 4.将二进制数据转换为可读数据 // 这一步不能将数据读出到屏幕上,这一步的作用只是把二进制数据转换为可读数据 int d; int z[20]; char c[15]; ifs.read((char*)&d, sizeof(d)); ifs.read((char*)z, sizeof(z)); ifs.read((char*)&p, sizeof(p)); ifs.read((char*)c, sizeof(c)); // 5.打印转换后的可读数据 // 用cout即可读出数据 cout << "d=" << d << endl; cout << "姓名: " << p.m_Name << " 年龄: " << p.m_Age << endl; for (int i = 0; i < 20; i++) { cout << z[i] << endl; } for (int i = 0; i < 15; i++) { cout << c[i]; } cout << endl; // 6.关闭文件 ifs.close(); } int main() { test01(); system("pause"); return 0; }
比如用write函数写入一个整形数组:
int c[20];
ofs.write((const char*)&c, sizeof(c));
那么read函数接受时也应用整形数组来接受:
int z[20];
ifs.read((char*)z, sizeof(z));
比如按下列顺序用write函数写入了以下四个数据类型:
int a = 55;
int d[20];
Person p = { "张三" , 18 };
char c[15] = { "Hello,World!" };
//4、按下列顺序写入文件
ofs.write((const char*)&a, sizeof(a));
ofs.write((const char*)d, sizeof(c));
ofs.write((const char*)&p, sizeof(p));
ofs.write((const char*)c, sizeof(c));
read函数查看时也得与写入时的顺序相同:
int d;
int z[20];
char c1[15];
Person p1;
// 注意各个read函数的顺序
ifs.read((char*)&d, sizeof(d));
ifs.read((char*)z, sizeof(z));
ifs.read((char*)&p1, sizeof(p1));
ifs.read((char*)c1, sizeof(c1));
不能写成下面这样:
int d;
int z[20];
char c1[15];
Person p1;
ifs.read((char*)&d, sizeof(d));
ifs.read((char*)c1, sizeof(c1));
ifs.read((char*)z, sizeof(z));
ifs.read((char*)&p1, sizeof(p1));
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。