☘️ 前言:
⛪️ 个人主页:Jemery-An
个人介绍:业余编码,出现错误希望大家不吝赐教,相互学习,共同讨论,一起进步
☀️ 摘抄好句:日积月累
文章介绍:简单记录个人在学习C++的笔记
在C++中,输入输出是同流来完成的。C++的输出操作将一个对象的状态转换成一个字符序列,输出到某个地方。
输入操作也是从某个地方接收到一个字符序列,然后将其转换成一个对象的状态所要求的格式。
这看起来很像数据在流动,于是把接收输出数据的地方叫做目标,把输入数据来自的地方叫做源。
而输入和输出操作可以看成字符序列在源、目标以及对象之间的流动。
在C++里,文件操作是通过流来完成的。C++总共有输入文件流、输出文件流和输入输出文件流3种,并已将它们标准化。
1、要打开一个输入文件流,需要定义一个 ifstream类型的对象。->Input-stream
2、要打开一个输出文件流,需要定义一个 ofstream类型的对象。->Ouput-stream
3、如果要打开输入输出文件流,则要定义一个 fstream类型的对象。->File-stream
这3种类型都定义在头文件 fstream 里。
一个输出流对象是信息流动的目标,ofstream是最重要的输出流。
一个输入流对象是数据流动的源头,ifstream是最重要的输入流。
一个iostream对象可以是数据流动的源或目标,fstream就是从它派生的。
可以总结出对文件进行操作的方法如下:
(1)包含头文件
(2)创建一个流对象
(3)将这个流和相应的文件关联起来
#include
#include //1、包含输入输出流头文件
using namespace std;
void outstream(){
ofstream ofs; //2、打开一个相应的文件流
ofs.open("mytest.txt"); //3、流与文件关联上
};
int main(){
return 0;
}
因为ifstream、ofstream和fstream这3个类都具有自动打开文件的构造函数,而这个构造函数就具有 open() 的功能。
因此,我们可以在创建流对象的时候就可以关联文件:ofstream myStream("myText.txt");
(4)操作文件流
注意:
我们在写文件的时候如果打开的文件不存在或者路径错误那么会自动生成一个文件!!!
open函数的原型如下:
void open(char const *,int filemode,int =filebuf::openprot);
它有3个参数,第1个是要打开的文件名,第2个是文件的打开方式,第3个是文件的保护方式,一般都使用默认值。
第2个参数可以取如下所示的值:
打开方式 | 解释 |
---|---|
ios::in | 打开文件进行读操作,这种方式可避免删除现存文件的内容 |
ios::out | 打开文件进行写操作,这是默认模式 |
ios::ate | 打开一个已有的输入或输出文件并查找到文件尾开始 |
ios::app | 在文件尾追加方式写文件 |
ios::binary | 指定文件以二进制方式打开,默认为文本方式 |
ios::trunc | 如文件存在,将其长度截断为零并清除原有内容,如果文件存在先删除,再创建 |
除ios_base::app方式之外,在其他几种方式下,文件刚刚打开,是指示当前读写位置的文件指针都定位于文件的开始位置,而ios_base::app使文件当前的写指针定位于文件尾。这几种方式也可以通过 “或” 运算符 “|” 同时使用
如果指定文件路径,路径中的“\”号必须使用转义字符表示。
案例:
void outperint() {
ofstream ofs; //打开一个写的文件流
ofs.open("test.txt", ios::out); //把这个流和文件关联起来
ofs << "姓名:张三" << endl;
ofs << "年龄:18" << endl;
ofs << "性别:男" << endl;
ofs.close(); //操作完成记得close()关闭
}
函 数 功 能
函数 | 功能 |
---|---|
bad() | 如果进行非法操作,返回true,否则返回false |
clear() | 设置内部错误状态,如果用缺省参量调用则清除所有错误位 |
eof() | 如果提取操作已经到达文件尾,则返回true,否则返回false |
good() | 如果没有错误条件和没有设置文件结束标志,返回true,否则返回false |
fail() | 与good相反,操作失败返回false,否则返回true |
is_open() | 判定流对象是否成功地与文件关联,若是,返回true,否则返回false |
void inputfile() {
ifstream ofs;
ofs.open("test.txt", ios::in);
if (ofs.is_open()) {
cout << "已成功和文件关联!!!" << endl;
//三种读数据方式
//第一种
char chr[1024];
while (ofs >> chr) {
cout << chr << endl;
}
//第二种
char buf[1024] = { 0 };
while (ofs.getline(buf, sizeof(buf)));
{
cout << buf << endl;
}
//第三种 第三种忘记了,反正前两种应该够用了
};
if (!ofs.is_open()) { //不为真
cout << "尚未与文件关联!!!" << endl;
}
ofs.close();
void outbin() {
ofstream obin; //创建写出流对象
obin.open("testbin.txt", ios::out | ios::binary); //二进制方式打开
Person p = { "李四",12,'男' };
//把对象写入到obin
obin.write((const char*)&p, sizeof(p));
//关闭文件
obin.close();
}
//二进制方式读文件
void readbin() {
//包含头文件
ifstream inbin;
//创建流对象
inbin.open("testbin.txt", ios::in, ios::binary);
//判断是否打开文件
if (!inbin.is_open()) {
cout << "文件打开失败!!" << endl;
return ;
}
Person p;
inbin.read((char*)&p, sizeof(p));
cout << "姓名:" << p.name << "年龄:" << p.age << endl;
inbin.close();
}
打开文件流后完成操作之后一定要关闭文件流,另外在写文件的时候使用is_open()函数判断文件是否打开意义不大,因为如果没有找到这个文件那么就会根据你填入的文件名自动创建一个这样的文件所以无论有没有文件都会返回 true