#include <iostream> #include <fstream> #include <string> ###----------------------------------------------------流式读写-------------------------------------------------------------- ###-----------------流式写-------------------------------------------------------------- // [//]: # (文件目录) char* filename="/Users/PQL/Desktop/simon_util/test.txt"; // [//]: # (创建对象) ofstream fout; // [//]: # (打开文件,ios::app追加写入,ios::out覆盖写入) // [//]: # (文件不存在会自动创建文件) fout.open(filename,ios::app); // [//]: # (判断文件是否打开,路径不存在会报错) if(fout.is_open()== false){ cout<<"打开"<<filename<<"文件失败";return 0; } // [//]: # (写入文件) int i=0; while(i<100){ fout<<"小杂毛:"<<i<<endl; i++; } // [//]: # (关闭文件) fout.close(); ###-----------------流式读-------------------------------------------------------------- // [//]: # (读取文件) char *filename = "/Users/PQL/Desktop/simon_util/test.txt"; // [//]: # (创建对象) ifstream fin; // [//]: # (打开文件) // [//]: # (文件不存在会报错) fin.open(filename, ios::in); if (fin.is_open() == false) { cout << "打开文件" << filename << "失败"; return 0; } // [//]: # (读取数据第一种方式) string buffer; while (getline(fin, buffer)) { cout << buffer << endl; } fin.close(); // [//]: # (读取数据第二种方式) char buffer1[101]; while (fin.getline(buffer1, 100)) { cout << buffer1 << endl; } fin.close(); // [//]: # (缓冲区一行字节超过101,会数据丢失) // // [//]: # (读取数据第三种方式) string buffer3; while (fin >> buffer3) { cout << buffer3 << endl; } // [//]: # (这种方式读出来的数据遇到空格就换行没有换行) fin.close(); ###----------------------------------------------------二进制读写-------------------------------------------------------------- ###-----------------二进制写-------------------------------------------------------------- // [//]: # (二进制格式读写文件) // [//]: # (写入数据) char* filename="/Users/PQL/Desktop/simon_util/test.dat"; // [//]: # (创建对象) ofstream fout; // [//]: # (打开文件) fout.open(filename,ios::app|ios::binary); if(fout.is_open()==false){ cout<<"打开文件"<<filename<<"失败";return 0; } struct st_gril{ char name[31]; int no; char memo[301]; double weight; }girl; girl={"西施",3,"中国第一美女",48.5}; fout.write((const char*)&girl,sizeof(st_gril)); // [//]: # (使用write()函数) // [//]: # (需要将结构体转为字符格式) girl={"貂蝉",2,"中国第二美女",50}; fout.write((const char*)&girl,sizeof(st_gril)); [//]: (关闭文件) fout.close(); ###-----------------二进制读-------------------------------------------------------------- // [//]: # (读取文件) char *filename = "/Users/PQL/Desktop/simon_util/b.dat"; // [//]: # (创建对象) ifstream fin; // [//]: # (打开文件) // [//]: # (文件不存在会报错) fin.open(filename, ios::in | ios::binary); if (fin.is_open() == false) { cout << "打开文件" << filename << "失败"; return 0; } // [//]: # (读取二进制文件第一种方式) struct st_gril { char name[31]; int no; char memo[301]; double weight; } girl; // [//]: # (按结构 一块一块读取文件) while (fin.read((char*)&girl, sizeof(st_gril))) { cout << "名字" << girl.name << "排名" << girl.no << "体重" << girl.weight<<endl; } // [//]: # (关闭文件) fin.close(); #---------------------文件指针-------------------------------------------------------------------- fin.tellp()获取当前指针位置 fin.tellg()同上 fin.seek(128)将指针移动到128 fin.seek(ios::beg)移动到初始位置 fin.seek(ios::end)移动到末尾位置 fin.seeg(30,ios::beg)开始位置后移动30 fin.seeg(-5,ios::cur)当前位置前移动5 fin.seeg(8,ios::cur)当前位置后移动8 fin.seeg(-10,ios::end)末尾位置前移动10 #--------------------文件缓冲区--------------------------------------------------------------------- 工作原理:减少磁盘io次数 fout.flush()刷新缓冲区; endl;换行并刷新缓冲区; fout<<unitbuf;设置fout输出流,在每次操作后刷新缓冲区; fout<<nounitbuf;设置fout输出流,回到缺省缓冲方式; 即时存入磁盘,停电啥的 #-------------------流状态判断-------------------------------------------- 1.eofbit 当输入流操作到达文件末尾时,将设置eofbit eof()成员函数检查流是否设置了eofbit 2.badbit 无法诊断的失败破环流时,将设置badbit(对输入流进行写入;磁盘没有空间了) bad()检查流是否设置了badbit 3.failbit 当输入流操作未能读取到预期字符时,将设置faibit(非致命,一般软件错误) 文件到末尾了,i/o失败也可能设置faibit 4.clear()清理流状态 5.setstate()重置流状态
c++文件操作
于 2023-02-05 15:09:20 首次发布