C语言:
1.二进制文件写
#include<stdio.h> void main() { int ar[10] = {12,23,34,45,56,67,78,89,90,100}; FILE *fp = NULL; //文件指针 fp = fopen("Text2.txt","w"); //打开文件 while(!fp) //打开失败 { cout<<"Open File Fail!"<<endl; return; } fwrite(ar,sizeof(int),10,fp); //写入二进制文件 fclose(fp); //关闭 }
<span style="font-size:18px;">#include<stdio.h> void main() { int ar[10]; FILE *fp = NULL; //文件指针 fp = fopen("Text2.txt","r"); //打开文件 while(!fp) //打开失败 { cout<<"Open File Fail!"<<endl; return; } fread(ar,sizeof(int),10,fp); //二进制读取文件 fclose(fp); //关闭 }</span>
<span style="font-size:18px;">#include<stdio.h> void main() { int ar[10] = {12,23,34,45,56,67,78,89,90,100}; FILE *fp = NULL; //文件指针 fp = fopen("Text3.txt","w"); //打开文件 while(!fp) //打开失败 { cout<<"Open File Fail!"<<endl; return; } for(int i = 0;i < 10;++i) //写入数据 { fprintf(fp,"%5d",ar[i]); } fclose(fp); //关闭文件 } </span>
<span style="font-size:18px;">#include<stdio.h> void main() { int ar[10]; FILE *fp = NULL; //文件指针 fp = fopen("Text3.txt","r"); //打开文件 while(!fp) //打开失败 { cout<<"Open File Fail!"<<endl; return; } for(int i = 0;i < 10;++i) //读出数据 { fscanf(fp,"%d",&ar[i]); } fclose(fp); //关闭 }</span>
C++在类ios中提供格式化输入输出。这些格式是对所有文本方式的输入输出流均适用。格式控制符定义为公有的无名的枚举类型:
enum{ skipws=0x0001,
//跳过输入中的空白字符
left=0x0002, //输出左对齐
right=0x0004, //输出右对齐
internal=0x0008, //在输出符号或数制字符后填充
dec=0x0010, //在输入输出时将数据按十进制处理
oct=0x0020, //在输入输出时将数据按八进制处理
hex=0x0040, //在输入输出时将数据按十六进制处理
showbase=0x0080, //在输出时带有表示数制基的字符
showpoint=0x0100, //输出浮点数时,必定带小数点
uppercase=0x0200,
//输出十六进制,用大写
showpos=0x0400, //输出正数时,加”+”号
scientific=0x0800, //科学数方式输出浮点数
fixed=0x1000, //定点数方式输出实数
unitbuf=0x2000, //插入后,立即刷新流
stdio=0x4000} //插入后,立即刷新stdout和stderr
该枚举量说明中每一个枚举量实际对应两字节数据(16位)中的一个位,所以可以同时采用几个格式控制,只要把对应位置1即可,这样既方便又节约内存。取多种控制时,用或“|”运算符来合成,合成为一个长整型数,在ios中为:
protected:
long x_flags;
类ios中还设置了三个输入输出流格式控制标志:
protected:
int x_precision; //标志浮点数精度,缺省为6位
int x_width; //输出域宽,缺省域宽为0,
//重设域宽只对其后第一输出项有效,如域宽不足,则不受限制
char x_fill; //标志域宽有富余时填入的字符
标准设备输入是最不安全的,注意以下几点,可以避免错误:
1. cin为缓冲流。键盘输入的数据保存在缓冲区中,当要提取时,是从缓冲区中拿。如果一次输入过多,会留在那儿慢慢用,如果输入错了,必须在回车之前修改,如果回车键按下就无法挽回了。只有把输入缓冲区中的数据取完后,才要求输入新的数据。不可能用刷新来清除缓冲区,所以不能输错,也不能多输!
2. 输入的数据类型必须与要提取的数据类型一致,否则出错。出错只是在流的状态字state(枚举类型io_state)中对应位置位(置1),程序继续。所以要提高健壮性,就必须在编程中加入对状态字state的判断。
3. 空格和回车都可以作为数据之间的分格符,所以多个数据可以在一行输入,也可以分行输入。但如果是字符型和字符串,则空格(ASCII码为32)无法用cin输入,字符串中也不能有空格。回车符也无法读入。
文件的打开与关闭
文件的使用步骤如下:
1.说明一个文件流对象,这又被称为内部文件:
ifstream ifile;//只输入用
ofstream ofile;//只输出用
fstream iofile;//既输入又输出用
2.使用文件流对象的成员函数打开一个磁盘文件。这样在文件流对象和磁盘文件名之间建立联系。文件流中说明了三个打开文件的成员函数。
void ifstream::open(const char*,int =ios::in,
int=filebuf::openprot);
void ofstream::open(const char *,int=ios::out,
int=filebuf::opernprot);
void fstream::open(const char*,int,
int=filebuf::openprot);
第一个参数为要打开的磁盘文件名。第二个参数为打开方式,有输入(in),输出(out)等,打开方式在ios基类中定义为枚举类型。第三个参数为指定打开文件的保护方式,一般取缺省。所以第二步可如下进行:
iofile.open(“myfile.txt”,ios::in|ios::out);
三个文件流类都重载了一个带缺省参数的构造函数,功能与open函数一样:
ifstream::ifstream(const char*,int=ios::in,int=filebuf::openprot);
ofstream::ofstream(const char*,int=ios::out,
int=filebuf::openprot);
fstream::fstream(const char*,int,
int=filebuf::operprot);
所以1,2两步可合成:
fstream iofile(“myfile.txt”,ios::in|ios::out);
打开文件也应该判断是否成功,若成功,文件流对象值为非零值,不成功为0(NULL),文件流对象值物理上就是指它的地址。
因此打开一个文件完整的程序为:
fstream iofile(”myfile.txt”,ios::in|ios::out);
if(!iofile){
cout<<”不能打开文件:”<<”myfile,txt”<<endl;
exit(1); } //失败退回操作系统
3.使用提取和插入运算符对文件进行读写操作,或使用成员函数进行读写,这在下一节中讨论。
4.关闭文件。三个文件流类各有一个关闭文件的成员函数
void ifstream::close();
void ofstream::close();
void fstream::close();
使用很方便,如:
iofile.close();
关闭文件时,系统把该文件相关联的文件缓冲区中的数据写到文件中,保证文件的完整,收回与该文件相关的内存空间,可供再分配,把磁盘文件名与文件流对象之间的关联断开,可防止误操作修改了磁盘文件。如又要对文件操作必须重新打开。
关闭文件并没有取消文件流对象,该文件流对象又可与其他磁盘文件建立联系。文件流对象在程序结束时,或它的生命期结束时,由析构函数撤消。它同时释放内部分配的预留缓冲区。
文件打开方式是在ios类中定义的,公有枚举成员:
enum open_mode{
in=0x01, //打开文件用于输入操作(从文件读取),文件指针在文件头
out=0x02, /*打开文件用于写入文件。如文件不存在,则建立,但指定目
录必须存在,否则建立文件失败。如文件存在,未同时设
app,ate,in则文件清空*/
ate=0x04,
//打开文件用于输入/输出,文件指针在文件尾,但新数据可写到任何位置
app=0x08, //打开文件用于输出,但从尾部添加,新数据只能添加在尾部
trunce=0x10, //打开文件,并清空它,以建立新文件
nocreate=0x20, //如文件存在则打开,不存在并不创建新文件
noreplace=0x40,
//如文件不存在则创建,如文件存在则只能设为ate及app方式
binary=0x80 }; //以二进制方式打开文件使用方法与格式控制符相同
1.文件写
#include <iostream> #include <fstream> using namespace std; void main() { int ar[10] = {12,23,34,45,56,67,78,89,90,100}; //给定写入文件的内容 ofstream ofile; //文件输出流 ofile.open("Text1.txt",ios::out); //打开文件 while(!ofile) //打开错误 { cout<<"Open File Fail!"<<endl; return; } for(int i = 0;i < 10;++i) //打开 { ofile<<ar[i]<<" "; } ofile.close(); //关闭文件 }
2.文件读
#include <iostream> #include <fstream> using namespace std; void main() { int ar[10]; ifstream ifile; //文件输入流 ifile.open("Text1.txt",ios::in); //打开文件 while(!ifile) //打开失败 { cout<<"Open File Fail!"<<endl; return; } for(int i = 0;i < 10;++i) //读取文件 { ifile>>ar[i]; } ifile.close(); //关闭文件 }
3.复制文件
#include <iostream> #include <fstream> using namespace std; void main() { ifstream sfile("E:\\VC++\\Text1.c"); ofstream dfile("E:\\t.c"); //只能创建文件,不能建立子目录,如路径不存在则失败 char ch; if(!sfile) { cout<<"Open Source File Fail!"<<endl; return; } if(!dfile) { cout<<"Open Target File Fail!"<<endl; return; } sfile.unsetf(ios::skipws); //关键!把跳过空白控制位置0,即不跳过空白,否则空白全未拷贝 while(sfile>>ch) { dfile<<ch; } sfile.close(); //如没有这两个关闭函数,析构函数也可关闭 dfile.close(); }
#include <iostream> #include <fstream> using namespace std; void main() { char filename[256],buf[100]; fstream sfile,dfile; cout<<"输入源文件的路径名:"<<endl; cin>>filename; sfile.open(filename,ios::in); //打开一个已存在的文件 while(!sfile) { cout<<"原文件找不到,请重新输入路径名:"<<endl; cin>>filename; sfile.open(filename,ios::in); } cout<<"输入目标文件路径名:"<<endl; cin>>filename; //只能创建文件,不能建立子目录,如路径不存在则失败 dfile.open(filename,ios::out); if(!dfile) { cout<<"目标文件创建失败"<<endl; return; } while(sfile.getline(buf,100))//按行拷贝 { if(sfile.gcount()<100)//因回车符未送到 { dfile<<buf<<'\n'; } else//本行大于99个字符,还未读到回车换行符,所以不加'\n' { dfile<<buf; } } sfile.close(); dfile.close(); }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/qaz3171210/article/details/46795863