
ofstream 类 打开文件进行写 *** 作,用这个类去创建对象只能做写 *** 作 output输出到文件
ifstream 类 读 *** 作
fstream 类 创建对象可读可写 用的时候包含头文件 #inclass="superseo">clude
打开文件: void open(const char* URL,ios::openmode mode);文件路径 + 读写方式(ios::openmode类型的枚举类型,就是一个整型变量,访问静态数据成员用类名限定 ios::)
读写方式
ios::in 读方式打开文件,不具备创建功能
ios::out 写方式打开文件,具备创建功能
ios::app 追加模式(在原文件的末尾接着写),具备创建功能
ios::ate (打开已有文件)文件指针指向文件末尾,类似追加,不具备创建功能
ios::trunc 具备创建功能
ios::nocreate 不具备创建
ios::noreplace 不替换 (写 *** 作会清除原文件,如果原文件存在,就不删除原文件 保留原文件的数据,想想C语言 w方式)
ios::binary 二进制的读写方式
读写的组合方式用的是 |(位或)无先后顺序可读可写可创建: ios::in | ios::out | ios::trunc
二进制的可读可写可创建: ios::in | ios::out | ios::trunc | ios::binary
判断打开文件是否成功用文件流对象重载的运算符 !- - - 取反代表失败
用文件对象中的成员函数判断 is_open() - - - 取反代表失败
返回 true 打开成功
返回 false 打开失败
关闭文件 void close() 读写文件方式流的方式读写
二进制的方式读写
string不能直接写到文件中去
需要先转换为char* 再写进去,参数只能传入char*
文件指针定位 - - - 不同对象的文件指针定位不同ifstream类的对象
istream& seekg(long int pos);
istream& seekg(long int pos,ios_base::seekdir position);重载版本:位置 + 定位(枚举类型)
ofstream类的对象
ostream& seekp(long int pos);
ostream& seekp(long int pos,ios_base::seekdir position);
ios_base::seekdir
ios::beg 文件开始位置 //类似c语言中的SEEK_SET
ios::end 文件结束位置
ios::cur 文件当前位置
打开 & 关闭文件 & 判断文件是否打开失败void testOpenFile()
{
fstream file; //创建文件对象
file.open("1.txt", ios::in);
if (!file.is_open())
{
cerr << "文件打开失败" << endl;
return;
}
if (!file)
{
cout << "文件打开失败" << endl;
return;
}
file.close(); //关闭文件
}
int main()
{
testOpenFile();
}
/*输出*/
文件打开失败
流的方式(ASCII码的方式)读写文件 - - - 把一个文件读到另一个文件中
void asciiRWFile(const char* readFileName, const char* writeFileName)
{
fstream read(readFileName, ios::in); //也可以用直接构造的方式创建
fstream write(writeFileName, ios::out); //分别用读&写的方式打开文件
//成员函数 eof() 用于判断是否在文件末尾
//1.1 流运算符的方式读写 空格和换行会被忽略
/*while (!read.eof())
{
char key; //用字符的方式读写
read >> key; //汉字出现乱码 改编码方式为ANSI 原文件为UTF-8
write << key;
} */
while (1)
{
char key;
read >> key;
if (read.eof()) //读出来后写之前判断 防止多读了一次 把eof()读出来了
{
break;
}
write << key;
}
//1.2 成员函数的方式读写 会接收空格和换行
while (1)
{
char key;
read.get(key);
if (read.eof())
break;
write.put(key);
}
//字符串的读写方式
while (!read.eof())
{
char str[1024] = ""; //出现覆盖的情况 每次读都要初始化
read.getline(str, 1024);
write.fstream::write(str, strlen(str)); //类名限定避免同名|统计读了多少后写入
write.put('\n'); //strlen(str)+1 换行符没有在字符串中 一行行读出来未写入回车
}
read.close();
write.close();
}
int main()
{
asciiRWFile("read.txt","write.txt");
}
把 read.txt中的东西读到 write.txt中
ILoveYou
我喜欢你
ILoveYou我喜欢你
二进制的方式读写文件
void binaryRWFile(const char* readFileName, const char* writeFileName)
{
fstream readFile(readFileName, ios::in | ios::binary);
fstream writeFile(writeFileName, ios::out | ios::binary);
while (!readFile.eof())
{
char str[1024] = ""; //准备缓冲区
readFile.read(str, 1024); //读数据
writeFile.write(str, 1024); //写入文件
}
readFile.close();
writeFile.close();
}
int main()
{
binaryRWFile("br.txt", "bw.txt");
}
wwww
eee
rr
wwww
eee
rr
文件指针移动
void testSeekRead(const char* fileName) //读取文件前4个和后4个
{
fstream fread(fileName, ios::in);
if (!fread)
{
cout << "打开文件失败!" << endl;
}
char key = fread.get(); //第一次直接读出来---得到文件指针刚开始在I的位置
cout << key;
fread.seekg(4,ios::beg); //相对于文件开始的位置移动4个位置 从第4个位置后面开始读
key = fread.get();
cout << key;
fread.seekg(-4, ios::end); //文件指针在文件末尾从后往前读
key = fread.get();
cout << key << endl;
fread.close();
}
int main()
{
testSeekRead("test.txt");
}
ILoveYouMissYou
Ies(读的是后面那个s) //文件指针第一次在I的位置 不是在I前面 I算是第一个位置欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)