关闭文件
当 C++ 程序终止时,它会自动关闭刷新所有流,释放所有分配的内存,并关闭所有打开的文件。但写程序时应该养成一个好习惯,在程序终止前关闭所有打开的文件。
下面是 close() 函数的标准语法,close() 函数是 fstream、ifstream 和 ofstream 对象的一个成员。
void close();
案例 - 写入
每次运行都会覆盖原来的内容:
#include <iostream> #include <fstream> //1.头文件 using namespace std; int main() { //2.创建流对象 ofstream outf; //3.打开文件 outf.open("file.txt"); //outf.open("file.txt",ios::out); //outf.open("file.txt",ios::app); //每次运行不会覆盖原来内容 //4.写入内容 outf << " 山村咏怀" << endl; outf << " 邵雍" << endl; outf << "一去二三里,烟村四五家。" << endl; outf << "亭台六七座,八九十枝花。" << endl; //5.关闭文件 outf.close(); return 0; }
案例 - 读取
#include <iostream> #include <fstream> //文件流的头文件 using namespace std; int main() { //char cf[100]; //字符数组 string cf; //字符串 ifstream infile; infile.open("file.txt",ios::in); //inf.open("file.txt"); infile >> cf; infile.close(); cout << cf; return 0; }
在c++中使用ifstream读文件的时候会以空格为分隔符,遇到空格就不读取了。这时候可以调用get函数来读取内容。
#include <iostream> #include <fstream> //文件流的头文件 using namespace std; int main() { char a ifstream infile; //定义ifstream类(输入文件流类)对象infile infile.open("file.txt"); //打开文件 使文件流与c++.txt文件建立关联 while (!infile.eof()) { infile.get(a); //依次获取文件中每个字符 并输出 cout << a; } infile.close(); return 0; }
其实读取方式分为很多种,每种方式效率不同:
#include<iostream> #include<fstream> #include<string> using namespace std; int main() { ifstream ifs; ifs.open("file.txt", ios::in); //判断是否打开 if (!ifs.is_open()) { cout << "文件打开失败!" << endl; return 0; } //读数据 //第一种:效率低,不建议使用 /*char c; while ((c = ifs.get()) != EOF) { cout << c; }*/ //第二种 /*char buf[1024] = {0}; while (ifs >> buf) { cout << buf << endl; }*/ //第三种 /*char buf[1024] = {0}; while (ifs.getline(buf, sizeof(buf))) { cout << buf << endl; }*/ //第四种 string buf; while (getline(ifs,buf)) //getline函数需要#include <string> { cout<<buf<<endl; } ifs.close(); return 0; }
二进制文件读写
写文件
二进制写文件主要利用流对象调用成员函数 write()
函数原型:
ostream& write(const char*buffer,int len);
参数解释:字符指针buffer指向内存中的一段存储空间,len是读写的字节数
案例:
#include <iostream> #include <fstream> using namespace std; class Student { public: Student() {} Student(string name,int age) :name(name), age(age) {} protected: string name; int age; }; int main() { ofstream bof; Student s1("张三", 100); bof.open("student.txt", ios::out|ios::binary); bof.write((const char*) & s1, sizeof(Student)); bof.close(); return 0; }
读文件
二进制读文件主要利用流对象调用成员函数 read()
函数原型:
istream& read( char*buffer,int len);
参数解释:字符指针buffer指向内存中的一段存储空间,len是读写的字节数
案例:
ifstream bif; bif.open("student.txt", ios::in | ios::binary); if (!bif.is_open()) { cout << "文件打开失败" << endl; return 0; } Student s2; bif.read((char*)&s2, sizeof(Student)); cout << s2.name << " " << s2.age << endl; bif.close();
fstream文件操作
ifstream支持>>操作,ofstream支持<<操作,fstream同时支持>>和<<操作。
打开文件 fstream可以在声明流对象时传入文件名打开文件,也可以使用open()函数打开文件。
关闭文件 文件打开后必须关闭,fstream提供close()函数关闭文件。
打开文件
使用构造函数声明对象时打开文件,示例:
fstream file(filename, ios::in | ios::out);
使用open()函数打开文件,函数原型:
void open(const char* filename,int mode,int access);
如果只传入文件名,系统会自动根据文件类型选择默认的打开模式。
打开文件模式mode如图:
模式和属性可以单独使用,也可以混合使用。混合使用时,用逻辑连接符或 |连接。
ios::out模式默认会清空,即ios::out|ios::trunc和ios::out打开文件时都会清空文件。
如果不想清空文件,那么设置读写模式为ios::out|ios::app,以这种模式打开文件后,数据会以追加的方式写入到文件。
读写文件
fstream提供的读写操作有:<<、>>、read()、write()、put()、get()、getline()。根据文件类型可分为文本文件和二进制文件,根据读写方式可分为逐行读写和整块读写。通常,文本文件使用逐行读写的方式,二进制文件使用整块读写的方式。
- 1.文本文件读写
逐行写入文本文件可以使用操作符====<<。
逐行读取文本文件时可以使用==getline()==函数。 - 2.二进制文件的读写
二进制文件通常整块读取或写入,当然也可以读写单个字符,用到的函数包括:put()、get()、read()、write()。
通常使用write()、put()函数写入二进制文件。使用read()、get()读取二进制文件。
案例
#include <iostream> #include <fstream> //1.包含头文件 #include <string> using namespace std; int main() { string str; fstream iofile; //2.创建对象 iofile.open("file.txt",ios::out|ios::in|ios::trunc); //3.打开文件 iofile << "这里是写入内容测试" << endl; //4.写入数据 iofile << "this is test" << endl; iofile.close(); //5.关闭文件 cout << "写入完毕" << endl; iofile.open("file.txt", ios::out | ios::in); while (getline(iofile,str)) //循环读取 { cout << str << endl; } iofile.close(); cout << "读取完毕" << endl; return 0; }
文件定位和大小
C++的文件定位分为读位置和写位置的定位,对应的成员函数分别为seekg()和seekp()。seekg()函数设置读位置,seekp()设置写位置。函数原型如下:
istream& seekg(streamoff offset,seek_dir origin); ofstream& seekp(streamoff offset,seek_dir origin);
示例:
inFile.seekg(2,ios::beg); // 把文件读指针从开始位置向后移动2个字节 outFile.seekp(2,ios::cur); // 把文件写指针从当前位置向后移动2个字节
获取文件大小可以使用seekg()和tellg()或者seekp()和tellp()函数结合使用的方式获取文件大小。
示例:
inFile.seekg(0,ios::end); // 读文件指针移动到文件末尾 streampos ipos = inFile.tellg(); //返回当前指针的位置,也就是文件的大小,单位是字节
由此,我们可以对文件大小进行计算:
#include <iostream> #include <fstream> using namespace std; int main(){ long start, end; ifstream ifile; ifile.open("test.txt", ios::in | ios::binary); start = ifile.tellg(); ifile.seekg(0, ios::end); end = ifile.tellg(); ifile.close(); cout << (end - start) << " bytes.\n"; //文件字节大小 return 0; }