1.打开文件
在fstream类中,成员函数open()实现打开文件的操作,从而将数据流和文件进行关联,通过ofstream,ifstream,fstream对象进行对文件的读写操作
函数: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 打开文件的属性 //基本很少用到,在查看资料时,发现有两种方式
打开文件的方式在ios类(所以流式I/O的基类)中定义,有如下几种方式:
ios::in | 为输入(读)而打开文件 |
ios::out | 为输出(写)而打开文件 |
ios::ate | 初始位置:文件尾 |
ios::app | 所有输出附加在文件末尾 |
ios::trunc | 如果文件已存在则先删除该文件 |
ios::binary | 二进制方式 |
这些方式是能够进行组合使用的,以“或”运算(“|”)的方式:例如
ofstream out; out.open("Hello.txt", ios::in|ios::out|ios::binary) //根据自己需要进行适当的选取
打开文件的属性同样在ios类中也有定义:
0 | 普通文件,打开操作 |
1 | 只读文件 |
2 | 隐含文件 |
4 | 系统文件 |
对于文件的属性也可以使用“或”运算和“+”进行组合使用,这里就不做说明了。
C++写文件示例程序:
#include <iostream> #include <string> #include <fstream> using namespace std; //ios_base::trunc - 如果文件已存在则先删除该文件 int main() { string filename = "student.txt"; #if 1 //方式一,创建默认文件输出流对象 ofstream outFile; outFile.open(filename.c_str(),ios_base::trunc | ios_base::out); //2,以清空写方式打开文件 #endif #if 0 //方式二:创建指定文件和以清空写文本文件的方式 ofstream outFile(filename.c_str()); #endif #if 0 //方式三:创建文件输入出流对象,并且以指定清空写方式打字符文件 ofstream outFile(filename.c_str(),ios_base::trunc | ios_base::out); #endif if(outFile.is_open()) //3,判断文件是否打开 成功打开,返回true { #if 0 outFile.put('C'); //4,写入单个字符 outFile.flush(); //清空缓冲区 #endif #if 0 string str = "hello world"; outFile.write(str.c_str(),str.length()); //5,写入字符串 outFile.flush(); #endif #if 1 int value = 100; //6,使用<<,写入字符串 string str = "hello world"; float f = 3.14f; outFile << value << " " <<str << " " << f << endl; //6,同时写入各种不同类型数据 outFile.flush(); #endif } outFile.close(); //7,关闭文件 }
C++读文件示例:
#include <iostream> #include <string> #include <fstream> #include <string.h> using namespace std; //filename.c_str() c_str()将str转换成const char * int main() { string filename = "student.txt"; #if 0 //创建默认的ifstream对象 ifstream in; in.open(filename.c_str(),ios_base::in); #endif #if 0 //创建ifstream对象,并指定到某一个文件,默认打开字符文件 ifstream in(filename.c_str()); #endif //创建ifstream对象,并指定到某一个文件,并以指定方式打开文件 ifstream in(filename.c_str(),ios_base::in); char buf[128] = {0}; if(in.is_open()) { #if 0 char ch = in.get(); //读一个字符 cout << "ch = " << ch << endl; #endif #if 0 memset(buf,0,sizeof(buf)); in.getline(buf,sizeof(buf) - 1); //只能读一行 cout << buf << endl; #endif #if 1 int len; len = in.tellg(); cout << "len=" << len << endl; //in.seekg(0,ios_base::end); //移动读写指针到从文件尾开始的第0个字节处 in.seekg(2,ios_base::beg); //移动读写指针到从文件头开始的第2个字节处 memset(buf,0,sizeof(buf)); in.read(buf,sizeof(buf) - 1); //可以从缓冲区读取,也能从文件中直接读取 cout << buf << endl; #endif #if 0 cout << "in.gcount() = " << in.gcount() << endl; //gcount用于检查缓冲区内可读字节数 memset(buf,0,sizeof(buf)); in.read(buf,sizeof(buf) - 1); cout << "in.gcount() = " << in.gcount() << endl; in.readsome(buf,in.gcount()); //只能从缓冲区读取内容 cout << buf << endl; #endif #if 0 //file: 100 hello world 3.14 string str1,str2,str3; in >> str1 >> str2 >> str3; //使用>>每次从文件读一个单词,以空格或'\n'为分隔符 cout << str1 << endl; //100 cout << str2 << endl; //hello cout << str3 << endl; //world #endif #if 0 char ch; while(!in.eof()) //eof()函数用于检查是否到达文件结尾 { ch = in.get(); cout << ch; } #endif #if 0 while(!in.eof()) { memset(buf,0,sizeof(buf)); in.getline(buf,sizeof(buf) - 1); //读取一行,但是不会读换行符 cout << buf << endl; } #endif #if 0 while(!in.eof()) { memset(buf,0,sizeof(buf)); in.read(buf,sizeof(buf) - 1); cout << buf; } cout << endl; #endif #if 0 string str; while(!in.eof()) { in >> str; cout << str << endl; } #endif in.close(); } }
3. 文件读写示例:
#include <iostream> #include <string> #include <fstream> #include <string.h> #include <vector> using namespace std; //filename.c_str() c_str()将str转换成const char * class student { public: student(); student(string name,int age) { this->name = name; this->age = age; } void showStudent() { cout << this->name << " " << this->age << endl; } private: string name; int age; }; student::student():name(""),age(0) { } int main() { string filename = "test.txt"; char buf[128] = {0}; //创建存储学生结构体的vector vector<student> vecStu; //添加学生到vector vecStu.push_back(student("li",12)); vecStu.push_back(student("wang",21)); vecStu.push_back(student("sun",41)); //创建输出文件流 ofstream out(filename.c_str(),ios_base::trunc | ios_base::binary); if(!out.is_open()) { cout << "ofstream open error!" << endl; exit(-1); } //将学生vector写入到输出文件流out for(int i=0;i<vecStu.size();i++) out.write((char *)&vecStu.at(i),sizeof(student)); out.close(); //-------------------------------------------------------------------- //创建ifstream对象,并指定到某一个文件,并以指定方式打开文件 ifstream in(filename.c_str(),ios_base::binary); if(!in.is_open()) { cout << "ifstream open error!" << endl; exit(-1); } vector <student> vecDest; //将读取的学生存入vecDest student temp; while(!in.eof()) { if(in.read((char*)&temp,sizeof(student))) vecDest.push_back(temp); } for(int i=0;i<vecDest.size();i++) vecDest.at(i).showStudent(); in.close(); }