03C++文件流
一、C++ IO类库
注意箭头哦!表示继承关系!如iostream多重继承istream和ostream哦!
二、对文本文件进行读写
- 类库: ifstream,ofstream,fstream
2.1 文件打开方式:
模式标志 | 描述 |
---|---|
ios::in | 读方式打开文件 |
ios::out | 写方式打开文件 |
ios::trunc | 若文件存在,会在打开文件之前将文件长度截断为0(相当于清空) |
ios::app | 尾部追加方式(在尾部写入) |
ios::ate | 文件打开后,定位到文件尾 |
ios::binary | 二进制方式 |
注意:以上打开方式,可以使用位操作"|"组合起来!!
2.2 文件输出流(写文件)示意
#include <fstream>
int main(){
string info = "hello,world!";
//1.定义一个文件输出流对象
ofstream outfile;
//2.使用输出流对象打开一个文件,方式为输出且截断
outfile.open("myFile.txt",ios::out|ios::trunc);
//3.写入文件
outfile << info ;
//4.关闭刚才打开的文件流
outfile.close();
}
2.3 文件输入流(读文件)示意
- 1、注意,>>会跳过空白字符,读取有效内容!
空格" “、制表符”\t"、换行符"\n"(创建新行)、
回车符"\r"(基本不用)、换页符“\f"、垂直制表符称为“空白字符”,因为它们与打印页上的单词和行之间的空格一样都是起到方便阅读的作用。 标记由空白字符和其他标记分隔(划分边界),如运算符和标点。
- 2、判断文件末尾–>文件结束符
//注意,>>会跳过空白符
void test2_read() {
ifstream inf1; //由于是ifsteam,默认ios::in
inf1.open("hello.txt");
string name;
int age;
while (1) {
inf1 >> name;
if(inFile.eof()) break;
inf1 >> age;
cout << name << "\t" << age << endl;
}
inf1.close();
}
2.4 二进制文件读写
- 文本文件和二进制的区别?
例:写一个数字1
文本文件:写的是字符“1”(比如char类型–>ASCII码 )
二进制文件:写的是实际的1 (int类型->四字节),写字符时,仍然是字符。
即:纯字符串时,没啥区别
写文件:
#include<fstream>
using namespace std;
int main(){
ofstream outfile;
file.open("my.dat",ios::out|ios::trunc|ios::binary);
string name;
int age;
while(1){
cin>>name;
if(cin.eof()) break;
cin>>age;
outfile << name <<"\t";
//下面的方式为何不可?因为 <<方式会自动转字符串,因此实际写入还是字符串
//outfile <<age<<endl;
outfile.write((char*)&age,sizeof(age));//使用write方法!!!
}
}
例如:name为rock,age为32
则二进制为:52 6f 63 6b 09 27 00 00 00
r o c k \t 39(4bytes)
读文件:
int main(){
string name;
ing age;
ifstream infile;
infile.open("my.dat",ios::in||ios::binary);
while(1){
infile>>name;
if(infile.eof()){break;}
infile.read((char*)&age,sizeof(char));//先读一个制表符!
cout<<name<<"\t";
//为何不能用>>呢?因为读字符串,然后转化为int,会出错!
infile.read((char*)&age,sizeof(age));
cout <<age<<endl;
}
}
2.5 按照指定格式读写数据
写:使用stringstream
#include<sstream>
using namespace std;
int main(){
streamstring s;
ofstream outfile;
outfile.open("myFile.txt",ios::out|ios::trunc);
//通过一下方法,格式化输出!
s<<name<<"\t"<<age<<endl;
outfile << s.str();
outfile.close();
}
读:使用getline读一行,然后用sscanf格式化。
#include<sstream>
using namespace std;
int main(){
ifstream s;
string line;
ofstream outfile;
outfile.open("myFile.txt",ios::in|ios::trunc);
getline(infile,line);
if(infile.eof()){break;}
sscanf_s(line.c_str(),"姓名%s 年龄%d",name,sizeof(name),&age,sizeof(age));
outfile.close();
}
三、文件状态位检查和文件流定位
3.1 状态位检查
- s.is_open()
- 文件是否打开。
- s.eof()
- 文件是否读完。
- s.fail()
- 流s的failbit位(非致命错),badbit位(致命错误)被置位时,返回true。
- s.badbit()
- 流的badbit位置位,返回true
- s.good()
- 流s处于有效状态位,返回true
- s.clear()
- 流s的所有状态位都被复位
3.2 文件流定位
输入流:
s.seekg(off_type offset,ios::seekdir origin);//设置输入流的位置
s.seekg(0,s.end);//文件尾
- 参数一:偏移量
- 参数2:相对位置
- beg 相对于开始位置
- cur 相对于当前位置
- end 相对于结束位置
int tellg();//返回该输出流的当前位置(距离起始位置的偏移量)
s.seekg(0,s.end);//文件尾
int filesize = infile.tellg()
输出流:
seekp(off_type offset,ios::seekdir origin)//设置输出流的位置
3.3其余接口
cin.ignore(count,'\n'); //把缓冲区内容全扔掉,直到遇到'\n'(包含这个)
//count为最多扔掉的字数
//可以设为std::numeric_limits<streamsize>::max() io流的最大字符个数
注意!!ignore会首先检测错误状态!若流处于错误状态,则不执行!!
所以clear在前,ignore在后!!
3.3其余接口
cin.ignore(count,'\n'); //把缓冲区内容全扔掉,直到遇到'\n'(包含这个)
//count为最多扔掉的字数
//可以设为std::numeric_limits<streamsize>::max() io流的最大字符个数
标签:03,文件,int,age,ios,C++,outfile,infile From: https://blog.csdn.net/weixin_49704754/article/details/144734743注意!!ignore会首先检测错误状态!若流处于错误状态,则不执行!!
所以clear在前,ignore在后!!