C++学习笔记之文件和流

来源:互联网 发布:中关村人工智能活动季 编辑:程序博客网 时间:2024/04/20 12:22
文件
普通文件
二进制文件
文本文件
输入输出设备:键盘、显示器、打印机等
  • 标准输入流(用指针stdin操作)
  • 标准输出流(用指针stdout操作)
  • 标准错误流(用指针stderr操作)
  • C++采用相同的方式操作普通文件和I/O设备
打开一个已存在的文件或建立并打开一个新文件
FILE *fopen( const char *filename, const char *mode );
filename——路径及文件名
mode——打开方式

例子1:使用FILE指针新建一个文本文件,写入了字符串"This is a test file. " 
//文件ex16_1.cpp#include <stdio.h>main(){FILE  *fptr; //定义FILE指针//打开或创建文件if ((fptr = fopen("test.txt","w")) != NULL) {//往文件中写入字符串fprintf(fptr, "This is a test file.");fclose(fptr); //关闭文件}elseprintf("Open file error.\n");return 0;} 
例子2:将字符、字符串、整数、浮点数、结构等类型的数据写入文件
//文件ex16_2.cpp ,写文件#include <stdio.h>struct Test{int a;double b;};int main() {Test st;st.a = 10;st.b = 1.1;FILE  *fptr; //声明文件指针//打开文件if((fptr=fopen("writetest.dat","wb"))!=NULL){//以二进制方式写入数据fwrite(&st, sizeof(st),1,fptr);//以字符方式写入一个字符fputc('a', fptr);//以字符方式写入一个字符串fputs("Beijing", fptr);//以字符方式写入整数和浮点数fprintf(fptr, " %d %f ", 23, 12.34);//关闭文件fclose(fptr);}elseprintf("Open file error.\n");return 0;}
例子3:将例2创建的文件中的数据读出来
//文件ex16_4.cpp,读二进制文件#include <stdio.h>struct Test{int a;double b;};int main() {Test st;char s[20];int m;float n;char c;FILE  *fptr;if((fptr=fopen("writetest.dat","rb"))!=NULL){fread(&st,sizeof(st),1,fptr);c = fgetc(fptr);fgets(s,8,fptr);fscanf(fptr," %d %f ",&m,&n);fclose(fptr);printf("STRUCT st: a = %d, b = %f\n",st.a, st.b);printf("CHAR c = '%c'\n", c);printf("STRING s = %s\n", s);printf("INTEGER m = %d, FLOAT n = %f\n",m, n);}else  printf("File open error.\n");return 0;} 
文件位置指针可以修改   int fseek(FILE *, long, int);
第一个参数——文件指针
第二个参数——偏移量
第三个参数——基准,可以为SEEK_SET、SEEK_CUR和SEEK_END,分别表示文件的起始位置、当前位置和文件尾
例子4:将例2创建的文件中的数据读出来,跳过字符'a'和字符串“Beijing”
//文件ex16_5.cpp,读文件#include <stdio.h>struct Test{int a;double b;};int main() {Test st;int m;float n;FILE  *fptr;if((fptr=fopen("wrtest.txt","rb"))!=NULL){fread(&st,sizeof(st),1,fptr);//修改文件位置指针,跳过字符a和字符串Beijingfseek(fptr,8,SEEK_CUR);fscanf(fptr," %d %f ",&m,&n);fclose(fptr);printf("STRUCT st: a = %d, b = %f\n",st.a, st.b);printf("INTEGER m = %d,\nFLOAT n = %f\n",m, n);}elseprintf("File open error.\n");return 0;} 
几个特殊的流对象
  • 标准输出流对象cout
  • 标准输入流对象cin
  • 非缓冲标准错误流对象cerr
  • 缓冲标准错误流对象clog
和文件流相关的几个类
  • 类ifstream——文件的输入
  • 类ofstream——文件的输出
  • 类fstream——文件的输入输出
  • 上述三个类都在头文件<fstream.h>中
例子5:使用文件流新建或打开一个文件,并写入字符串"This is a test file. "
//文件ex16_6.cpp,新建和打开文件#include <fstream>#include <iostream>using namespace std;int main(){//声明文件流对象ofstream  outFile("outFile.txt",ios::out);if (!outFile)//使用错误流对象输出错误信息cerr<<"Open file or create file error."<<endl;else//输出数据到与对象outFile 关联的文件中outFile << "This is a test file.";return 0;} 


通过文件流进行操作
ofstream outFile("outFile.txt",ios::out);
可以改写为:
ofstream outFile;
outFile.open("outFile.txt",ios::out); 

ofstream outFile;
outFile.open("outFile.txt");
文件可以显式关闭:
outFile.close();
例子7:用文件流的方式读取上例中程序创建的文件中的数据,跳过字符串“string”
//文件ex16_9.cpp,读文件#include <fstream>#include <iostream>using namespace std;int main() {ifstream inFile ("outFile.txt", ios::in);int a;  float c;if (!inFile) cerr<<"File open error."<<endl;else {inFile>>a;inFile.seekg(7,ios::cur);inFile>>c;cout<<"INT--"<<a<<endl<<"FLO--"<<c<<endl;inFile.close();}return 0;}
例子8:使用文件保存和恢复类的对象
//文件ex16_10.cpp, 以二进制方式读写对象#include <fstream>#include <iostream>using namespace std;class Test{public:Test(int m, double n){  a = m;  b = n; }void set(int m, double n){  a = m;  b = n; }void show(){  cout<<"int--"<<a<<"double--"<<b<<endl; }private:int a;double b;};int main() {Test st(10,10.5);cout<<"Object st:"<<endl;st.show();ofstream outFile("outFile.txt",ios::out|ios::binary);if (!outFile )cerr<<"Open file or create file error."<<endl;else {outFile.write((char *)&st,sizeof(st));outFile.close();}st.set(1,2.3);cout<<"After set, object st:"<<endl;st.show();//创建文件流对象,再次打开该文件用于读ifstream infile("outFile.txt", ios::in|ios::binary);if (!outFile )cerr<<"File open error."<<endl;else   {//从文件中恢复对象stinfile.read((char *)&st,sizeof(st));infile.close();}cout<<" After read from file:"<<endl;st.show();return 0;} 



原创粉丝点击