要使用控制台输入输出(cin,cout) 需要的头文件#include<iostream> 命名空间using namespace std;文件输入输出流,需要的头文件为 #include<fstream>(实际其内部包括:ifstream和ofstream)
文件流类继承关系:
1.打开文件
- open()
void open ( const char * filename,
ios_base::openmode mode = ios_base::in | ios_base::out );
void open (const wchar_t *_Filename,
ios_base::openmode mode= ios_base::in | ios_base::out,
int prot = ios_base::_Openprot);
filename-要打开的文件路径名,mode-打开文件方式,prot-打开文件属性
- 常用mode:
ios::in | 为输入打开文件 |
ios::out | 为输出打开文件 |
ios::ate | 文件打开初始位置在文件尾 |
ios::app | 以附加形式打开文件 |
ios::trunc | 若文件已存在先删除(以替换形式打开文件) |
ios::binary | 打开二进制文件 |
ios::nocreate | 不建立文件,所以文件不存在时打开失败 |
ios::noreplace | 不覆盖文件,所以打开文件时如果文件存在失败 |
mode可以组合使用,如:
std::ifstream in;
in.open(inputfileName,ios::in|ios::binary)
也可以在声明时直接隐式调用open(),如:
ifstream in(inputfileName,ios::in|ios::binary);
2.关闭文件
- close()
注意:关闭的只是流对象所打开的文件,仍然可以利用流对象去打开别的文件。如:
#include<fstream>
int main()
{
ifstream in("1.txt",ios::in);
in.close();
in.open("2.txt",ios::in);
}
3.文件输入输出流
文本文件的读写可以如同类与控制台交互一样利用"<<”进行写
#include<fstream>
using namespace std;
int main(){
ofstream out("out.txt");
if(out.is_open())
{
out<<"Hello World"<<endl;//写文件可直接使用"<<"运算符输出到输出流指向的文件中
out.close();
}
} //文件写操作
4.状态标志符
有一些验证流的状态的成员函数(所有都返回bool型返回值):
- bad()
如果在读写过程中出错,返回true. - fail()
除了与bad()同样的情况下返回true外,加上格式错误时也返回true,例如当想要读入一个整数 ,而得到一个字母。 - eof()
如果读文件到达文件的末尾,返回true。 - good()
最通用的验证:如果遇上以上任何一个函数返回true的话,此函数返回false。 - clear()
重置以上成员函数所检查的状态标志,没有参数。
5.其他常用函数
获得和设置流指针(get and put stream pointers)
所有输入/输出流对象(i/o streams objects)都有至少一个流指针:
- ifstream, 类似istream, 有一个被称为get pointer的指针,指向下一个将被读取的元素。
- ofstream, 类似 ostream, 有一个指针 put pointer ,指向写入下一个元素的位置。
- fstream, 类似 iostream, 同时继承了get 和 put
我们可以通过使用以下成员函数来读出或配置这些指向流中读写位置的流指针:
- tellg() 和 tellp()
这两个成员函数不用传入参数,返回pos_type 类型的值(根据ANSI-C++ 标准) ,就是一个整数,代表当前get 流指针的位置 (用tellg) 或 put 流指针的位置(用tellp).
- seekg() 和seekp()
这对函数分别用来改变流指针get 和put的位置。两个函数都被重载为两种不同的原型:
seekg(pos_type position);//输入流操作
seekp(pos_type position);//输出流操作
使用这个原型,流指针被改变为指向从文件开始计算的一个绝对位置。要求传入的参数类型与函数 tellg 和tellp 的返回值类型相同。
seekg ( off_type offset, seekdir direction );//输入流操作
seekp ( off_type offset, seekdir direction );//输出流操作
使用这个原型可以指定由参数direction决定的一个具体的指针开始计算的一个位移(offset)。它可以是:
ios::beg | 从流开始位置计算的位移 |
ios::cur | 从流指针当前位置开始计算的位移 |
ios::end | 从流末尾处开始计算的位移 |
文件操作比较全的一个文章:文件操作(FILE)与常用文件操作函数——C语言 - 蓝海人 - 博客园