常用写文件运算符<<,put,write
#include <fstream> #include<iostream> using namespace std; int main(int argc, char* argv[]) { ofstream fs; fs.open("d:\\132.txt");//没有文件会自动生成 if (!fs) { cout << "无法打开文件" << endl; return 0; } fs << 2000 << endl; fs << 1.25 << endl; fs << "hello" << endl; fs.put('y');//只能写一个字符 char nn[] = "\nddadd\n"; fs.write(nn,sizeof(nn));//地址,长度,,写进去的默认是二进制 fs.close(); system("pause"); return 0; }常用读文件运算符>>,get,getline
int main(int argc, char* argv[]) { ifstream fs; fs.open("d:\\132.txt");//没有文件会自动生成 if (!fs) { cout << "无法打开文件" << endl; return 0; } //int abc = 0; //fs >> abc; //cout << abc << endl; //float abcd = 0; //fs >> abcd; //cout << abcd << endl; //char szbuf[100] = { 0 }; //fs >> szbuf; //cout << szbuf << endl; //char ch = fs.get(); //cout << ch << endl; //char ch1 = fs.get(); //cout << ch1 << endl; //char ch2 = fs.get(); //cout << ch2 << endl; char szbuf[100] = { 0 }; fs.getline(szbuf,100); cout << szbuf << endl; memset(szbuf, 0, 100);//清空缓冲区 fs.getline(szbuf, 100); cout << szbuf << endl; fs.close(); system("pause"); return 0; }①、文件读写是否成功? 可以使用 good、bad、fail 来进行判断! fail() 方法用于判断最后一次读取数据的时候是否遇到了类型不配的情况,若是返回true(如果遇到了EOF,该方法也返回true) bad() 如果出现意外的问题,如文件受损或硬件故障,最后一次读取数据的时候发生了这样的问题,方法 bad() 将返回true。 good() 该方法在没有发生任何错误的时候返回true。该方法也指出的最后一次读取输入的操作是否成功。
②、读取文件的时候是否已经读到文件末尾? 可以使用 eof 来进行判断!eof() 方法用于判断最后一次读取数据的时候是否遇到EOF,即到达文件末尾,若是则返回true。
#include <fstream> #include<iostream> using namespace std; int main(int argc, char* argv[]) { //开始写 ofstream fs_write; fs_write.open("d:\\132.txt");//没有文件会自动生成 if (!fs_write) { cout << "无法打开文件" << endl; return 0; } int var = 2000; fs_write << var << endl; fs_write << var + 1 << endl; fs_write.close(); //开始读 ifstream fs_read; fs_read.open("d:\\132.txt"); if (!fs_read)return 0; var = 0; fs_read >> var; bool read_is_good=fs_read.good();//返回值是bool类型,判断是否读取成功 bool end_of_file = fs_read.eof();//返回值是bool类型,判断是否文件末尾 cout << "read_is_good=" << read_is_good<<endl; cout << var << endl; fs_read >> var; read_is_good = fs_read.good(); cout << "read_is_good=" << read_is_good << endl; cout << var << endl; fs_read.close(); system("pause"); return 0; }文件流提供以下成员函数来读取或配置文件指针
tellg() 返回读取文件指针的当前位置 tellp() 返回写入文件指针的当前位置 seekg(指针偏移量) 将读取文件指针移到指定位置 seekg(指针偏移量,参照位置) 将读取文件指针移到指定位置 seekp(指针偏移量) 将写入文件指针移到指定位置 seekp(指针偏移量,参照位置) 将写入文件指针移到指定位置
ios::beg 文件开头计算偏移量 ios::cur 文件当前位置计算偏移量 ios::end 文件结尾计算偏移量
例子
#include <fstream> #include<iostream> using namespace std; int main(int argc, char* argv[]) { //开始写 ofstream fs_write; fs_write.open("d:\\132.txt");//没有文件会自动生成 if (!fs_write) { cout << "无法打开文件" << endl; return 0; } int var = 2000; fs_write << var << endl; fs_write << var + 123 << endl; fs_write.close(); //开始读 ifstream fs_read; fs_read.open("d:\\132.txt"); if (!fs_read)return 0; var = 0; int read_pstr = fs_read.tellg(); cout << "read_pstr=" << read_pstr << endl;//0 fs_read >> var; read_pstr = fs_read.tellg(); cout << "read_pstr=" << read_pstr << endl;//4 //fs_read.seekg(read_pstr+3);//文件指针向后3位 fs_read.seekg(0, ios::cur); cout << var << endl; fs_read >> var; read_pstr = fs_read.tellg(); cout << "read_pstr=" << read_pstr << endl;//10 有换行 cout << var << endl; fs_read.close(); system("pause"); return 0; }利用ios::end求文件大小。
#include <fstream> #include<iostream> using namespace std; int main(int argc, char* argv[]) { //开始写 ofstream fs_write; fs_write.open("d:\\132.txt");//没有文件会自动生成 if (!fs_write) { cout << "无法打开文件" << endl; return 0; } int var = 2000; fs_write << var << endl; fs_write << var + 123 << endl; fs_write.close(); //开始读 ifstream fs_read; fs_read.open("d:\\132.txt"); if (!fs_read)return 0; fs_read.seekg(0, ios::end);//利用ios::end求文件大小 int file_size = fs_read.tellg(); cout << "file_size "<< file_size << endl; fs_read.close(); system("pause"); return 0; }实现文件的拷贝功能
#include <fstream> #include<iostream> using namespace std; void filecopy(const char* des_file,const char* src_file) { //实现文件的拷贝功能 //des_file为目标文件,src_file为源文件 //读取源文件 ifstream fs_read; fs_read.open(src_file, ios::binary);//这里必须要用二进制读取文档,不然会出现乱码,无法读取/r if (!fs_read){ cout << "源文件打开失败" << endl; return ; } fs_read.seekg(0, ios::end); int src_file_len = fs_read.tellg(); cout << "文件大小为" << src_file_len << endl; fs_read.seekg(0, ios::beg);//文件指针记得要指回来 char* file_char = new char[src_file_len]; fs_read.read(file_char, src_file_len); fs_read.close(); //写入目标文件 ofstream fs_write; fs_write.open(des_file, ios::binary); if (!fs_write){ cout << "目标文件打开失败" << endl; return; } fs_write.write(file_char, src_file_len); /*fs_write << file_char << endl;*/ cout << "写入成功" << endl; fs_write.close(); delete[]file_char; } int main(int argc, char* argv[]) { char* src_file = "d:\\123.txt"; char* des_file = "d:\\789.txt"; filecopy(des_file, src_file); system("pause"); return 0; }1. read必须要用二进制读取文档,不然会出现乱码,无法读取/r 2. fs_read.seekg(0,ios::end);改变文件指针之后,记得改回要读的地址。
