C++文件的读写存在一个问题:支持窄字节,不支持宽字节
文件类型分为:文本文件、二进制文件
C++ 通过以下几个类支持文件的输入输出:
ofstream: 写操作(输出)的文件类
ifstream: 读操作(输入)的文件类
fstream: 可同时读写操作的文件类
需要 #include <fstream>
using namespace std;
视频教程:
读写文本文件:
ofstream fs;//创建一个写文件流
fs.open("d:\\123.txt"); //打开文件 【个人:重新创建文件,原有内容被删除】
/*
参数2 打开方式
ios::in 读 ios::out 写
ios::binary 二进制方式 ios::ate 初始位置:文件尾
ios::app 所有输出附加在文件末尾 ios::trunc 如果文件已存在则先删除该文件
这些标识符可以被组合使用,中间以操作符(|)间隔
*/
//ofstream fs("d:\\123.txt");//创建并打开一个写文件流
fs << 20000 << endl; //把20000写入文件
fs.close(); //关闭文件
ifstream fs1; //创建一个读文件流
fs1.open("d:\\123.txt"); //打开文件
int var = 88;
fs1 >> var; //读取文件内容,放到var变量中
fs1.close();
判断文件打开是否成功:
方法一:
if (!fs)
{
str = _T("文件打开失败");
}
文件打开失败,fs=null
方法二:
if (!fs.is_open())
{
str = _T("文件打开失败");
}
文件打开失败,fs.is_open()返回null
方法三:
文件打开失败,fs.good()返回false
good() 该方法在没有发生任何错误的时候返回true。该方法也指出的最后一次读取操作是否成功
写文件:
fs << 20000 << endl; //把整数20000写入文件
fs << 18.9 << endl; //写浮点数
fs << "word" << endl;
fs << "中国" << endl; //写入窄字节中文;不能宽字节
fs.put('y'); //写入英文字符
读文件:
int var = 88;
fs1 >> var; //读取整数值,放到var变量中
float fl;
fs1 >> fl; //读取浮点数,放到fl变量中
char ch[100];
fs1 >> ch; //读取字符串,放到ch变量中
fs1 >> ch;
char ch1 = fs1.get(); //读取一个字符,包括\n \r
char ch[100];
fs1.getline(ch,100); //读取一行,放到ch变量中
//参数2 ch缓冲区大小
文件指针:
bool bl = fs1.eof(); //判断文件指针是否到了文件末尾,在文件末尾返回True
x = fs1.tellg(); //返回文件读指针位置;在文件末尾返回-1
x = fs.tellp(); //返回文件写指针位置
fs1.seekg(-4, ios::cur);//移动文件读指针
参数1:移动偏移量(字节数),可以是正负数值,正的表示向后偏移,负的表示向前偏移
参数2:可以是
ios::beg 表示输入流的开始位置
ios::cur 表示输入流的当前位置
ios::end 表示输入流的结束位置
fs.seekp(-4, ios::cur); //移动文件写指针
参数1:移动偏移量(字节数),可以是正负数值,正的表示向后偏移,负的表示向前偏移,
参数2:可以是
ios::beg 表示输入流的开始位置
ios::cur 表示输入流的当前位置
ios::end 表示输入流的结束位置
fs.seekg(1); //移动文件读指针到某一位置
fs.seekp(1); //移动文件写指针到某一位置
文件大小:把文件指针移到末尾,返回指针位置就是文件大小(字节数)
读写二进制文件:
ofstream fs;//创建一个写文件流
fs.open("d:\\1234.txt"); //打开文件
int var = 20000;
fs.write((char*)&var,sizeof(var)); //把var变量的内容写入文件
//参数1 要写入的内容 char*类型的地址
//参数2 写入的字节数
fs.close(); //关闭文件
ifstream fs1; //创建一个读文件流
fs1.open("d:\\1234.txt"); //打开文件
var = 88;
fs1.read((char*)&var,sizeof(int)); //读取文件内容,放到var变量中
//参数1 读取数据保存的变量地址
//读取字节数
fs1.close();