1、ASCII文件(参考谭浩强)
个人理解:用于整数和单个字符的输入输出,文件形式用.txt
仅写出必要语句:
#include<fstream>
#include<iostream>//有些编辑器不需要这一句
using namespace std;
int main(){
//从文件中读入
ifstream infile("E:\\My C\\data\\test.txt",ios::in);
int a[10];
if(!infile){
cerr<<"open fail!";
exit(1);
}
for(int i=1;i<=10;i++){
infile>>a[i];
//infile.get(a[i]);
cout<<a[i]<<endl;
}
infile.close();
return 0;
}
//向文件中写入
ofstream outfile("E:\\My C\\data\\test.txt",ios::out);
char ch;
outfile<<ch;
//outfile.put(ch);
//循环语句,将文本内容全部读完
ifstream infile("E:\\My C\\data\\test.txt",ios::in);
char ch;
while(infile.get(ch))
//while(infile>>ch)
2 二进制文件
二进制文件输入输出更方便,但是我们打开txt文件是不能直接看的。以结构体为例:
(1)读取输出二进制文件所用函数代码示例:
typedef struct student
{
char name[20];
int age;
}student;
//以上为结构体
student s1[3]{"Li",1,"Zhao",2,"Qian",3};
//写进文件中
ofstream outfile("E:\\My C\\data\\test1.txt",ios::binary);
//报错语句同上,省略
for(int i=0;i<3;i++)
outfile.write((char*)&s1[i],sizeof(s1[i]));
outfile.close();
//write函数的原型中,第一个参数是字符指针类型,而&s1[i]是一个结构体的地址,所以用(char*)强制转换成字符指针
//从文件中读取
ifstream infile("E:\\My C\\data\\test1.txt",ios::binary);
student s2[3];
for(int i=0;i<3;i++)
infile.read((char*)&s2[i],sizeof(s2[i]));
// 同write
infile.close();
//读取,两种功能
fstream iofile("E:\\My C\\data\\test1.txt",ios::in|ios::out|ios::binary);
3、按行读取文件,统计文件行数
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int CountLine(char *filename){
string ch;
int Et=0,E_n=0,e_n=0,num;
ifstream infile(filename,ios::in);
if(!infile){
cerr<<"open fail"<<endl;
exit(0);
}
while(getline(infile,ch,'\n')){//这行代码是按行读取的关键
Et++;
for(int i=0;i<ch.length();i++){
if(ch[i]>='A'&&ch[i]<='Z') E_n++;
if(ch[i]>='a'&&ch[i]<='z') e_n++;
if(ch[i]>='0'&&ch[i]<='9') num++;
}
}
cout<<"文件行数"<<Et<<"大写字母数"<<E_n<<"小写字母数"<<e_n<<"数字数"<<num<<endl;
infile.close();
return Et;
}
int main(){
char ch[100]="E:\\My C\\data\\test1.txt";
int line=CountLine(ch);
return 0;
}
几个用来改变指针位置的函数
seekp,用于输出文件p即为(put)
seekg,用于输入文件g即为(get)
代码示例:
fstream iofile("E:\\My C\\data\\test1.txt",ios::in|ios::out|ios::binary);
iofile.seekg(2*sizeof(s2[0]),ios::beg);
//fstream得到是一个输入输出两用的对象,用seekp,seekg都可以,这句代码效果是:将指针定位到结构体数组中第三个元素的开头
//ios::beg文件开头
//ios::current当前位置
ios::end文件末尾
文件控制语句代码
1、控制文件宽度,填充图案
cin>>a;
for(i=1;i<=5;i++){
cout<<setw(a-i+1)<<setfill(' ')<<" ";//setw控制宽度,参数必须大于零
cout<<setw(2*i-1)<<setfill('*')<<"*";
cout<<setw(a-i+1)<<setfill(' ')<<" ";
cout<<endl;
}
运行结果: