C++对于文件的各种操作是通过创建文件流对象进行的,在标准库中有三个类可用于文件操作
istream:从文件中读取数据
ostream:向文件中写入数据
fstream:既可从文件中读取数据,也可向文件中写入数据(一般用这个)
它们的继承关系如图:
打开文件:
首先创建文件流对象,有两种方式可以用来打开文件,一种是使用构造函数(有实例演示),另一种是调用对象的open函数,原型如下:
void open(const char *filename,int mode);
函数中第一个参数为文件指针,指明文件的存储位置,第二个参数代表各种打开模式标记
关闭文件:
void close(); 对文件操作完成后应及时关闭文件流对象
写入文件:
首先创建文件输出流对象,使用模式标记ios::out,配合operator<<将数据写入到指定文件中,默认以文本文件方式读入
//文本文件
#include<iostream>
#include<cstdio>
#include<fstream>
#include<cstring>
#include<string>
using namespace std;
int main(){
char s[100];
//用构造函数创建文件输出流对象
ofstream writefile("D:\\barca.txt",ios::out);
//向文本文件中写入若干行数据,遇到 exit 退出
while(cin.getline(s,100)){
if(strcmp(s,"exit")==0) break;
else{
writefile<<s;
writefile<<endl;
}
}
writefile.close();
}
二进制文件写入:添加模式标记ios::binary,调用write函数,其原型如下:
ostream & write(char *buffer,int count);
将内存中buffer指向的count个字节的内容写入文件中 ,文件刚打开时写指针指向文件开头,可任意指定写指针位置
//二进制文件
#include<iostream>
#include<cstdio>
#include<fstream>
#include<cstring>
using namespace std;
int main(){
char s[100];
fstream writefile("D:\\yrf.dat",ios::out|ios::binary);
while(cin.getline(s,100)){
if(strcmp(s,"exit")!=0){
writefile.write((char*)&s,sizeof(s));
}
else break;
}
writefile.close();
}
读取文件:
首先创建文件输入流对象,使用模式标记ios::in,配合operator>>从文件中读取数据
//读取文本文件
ifstream readfile;
readfile.open("D:\\barca.txt",ios::in);
if(!readfile){
cout<<"Error,file not exist"<<endl;
return 0;
}
//显示到控制台
while(readfile>>s){
cout<<s<<endl;
}
readfile.close();
读取二进制文件:添加模式标记ios::binary,调用read函数,其原型如下:
istream & read(char* buffer,int count);
从文件中读取count个字节的内容,存放到buffer所指的缓冲区
//读取二进制文件
fstream readfile("D:\\yrf.dat",ios::in|ios::binary);
if(!readfile()){
cout<<"Error,file not exist"<<endl;
return 0;
}
while(readfile.read((char*)&s,sizeof(s))){
cout<<s<<endl;
}
readfile.close();
结果演示:
文本文件读写与二进制文件读写的区别:
UNIX/Linux:无区别
在Windows平台中,文本文件的连续字节"\r\n"('\r'ASCALL码表示为0x0d,'\n'ASCALL码表示为0x0a)表示实际的换行符'\n'。
因此,在读文本文件时会将"\r\n"转化为'\n',即自动地将"0x0d0a"转化为"0x0a"
写文本文件时会将"\n"转化为"\r\n",即自动添加"0x0d"
所以用打开文本文件的方式打开二进制文件时会造成读出内容与实际内容不相符
从计算机科学角度来讲,所有的文件都是由二进制位组成的,都是二进制文件,二者的区别只是格式不同,也就是说任何文件都能够以二进制形式进行读写。