关闭

【C/C++】文件读写

标签: C++C语言文件操作
342人阅读 评论(0) 收藏 举报
分类:

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);                                      //关闭
}

2.二进制文件读

<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>

3.文件写

<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>

4.文件读

<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++:

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.使用提取和插入运算符对文件进行读写操作,或使用成员函数进行读写,这在下一节中讨论。
.关闭文件。三个文件流类各有一个关闭文件的成员函数 
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();
}

4.按行复制文本文件

#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();

}

请大家指出不足的地方~谢谢,我会努力改正的。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:121169次
    • 积分:3695
    • 等级:
    • 排名:第8736名
    • 原创:255篇
    • 转载:36篇
    • 译文:0篇
    • 评论:18条
    最新评论