导航:首页 > 源码编译 > ofstream编译系统

ofstream编译系统

发布时间:2022-09-28 08:15:56

1. 输入语句(如cin)在计算机内部是怎样运行的

、 C++流的概念

在C++语言中,数据的输入和输出(简写为I/O)包括对标准输入设备键盘和标准输

出设备显示器、对在外存磁盘上的文件和对内存中指定的字符串存储空间(当然可

用该空间存储任何信息)进行输入输出这三个方面。对标准输入设备和标准输出设

备的输入输出简称为标准I/O,对在外存磁盘上文件的输入输出简称为文件I/O,对

内存中指定的字符串存储空间的输入输出简称为串I/O。
C++语言系统为实现数据的输入和输出定义了一个庞大的类库,它包括的类主要有ios,istream,ostream,iostream,ifstream,ofstream,fstream,istrstream,ostrs

tream,strstream等,其中ios为根基类,其余都是它的直接或间接派生类。

ios为根基类,它直接派生四个类:输入流类istream、输出流类ostream、文件流

基类fstreambase和字符串流基类strstreambase,输入文件流类同时继承了输入流

类和文件流基类(当然对于根基类是间接继承),输出文件流类ofstream同时继承了输出流类和文件流基类,输入字符串流类istrstream同时继承了输入流类和字符串流基类,输出字符串流类ostrstream同时继承了输出流类和字符串流基类,输入输出流类iostream同时继承了输入流类和输出流类,输入输出文件流类fstream同时继承了输入输出流类和文件流基类,输入输出字符串流类strstream同时继承了输入输出流类和字符串流基类。
“流”就是“流动”,是物质从一处向另一处流动的过程。C++流是指信息从外部输入设备(如键盘和磁盘)向计算机内部(即内存)输入和从内存向外部输出设备(如显示器和磁盘)输出的过程,这种输入输出过程被形象地比喻为“流”。为了实现信息的内外流动,C++系统定义了I/O类库,其中的每一个类都称作相应的流或流类,用以完成某一方面的功能。根据一个流类定义的对象也时常被称为流。如根据文件流类fstream定义的一个对象fio,可称作为fio流或fio文件流,用它可以同磁盘上一个文件相联系,实现对该文件的输入和输出,fio就等同于与之相联系的文件。
C++系统中的I/O类库,其所有类被包含在iostream.h,fstream.h和strstrea.h这三个系统头文件中,各头文件包含的类如下:
iostream.h包含有:ios, iostream, istream, ostream, iostream_withassign,
istream_withassign, ostream_withassign等。
fstream.h包含有:fstream, ifstream, ofstream和fstreambase,以及iostream.h
中的所有类。
Strstrea.h包含有:strstream, istrstream, ostrstream和strstreambase,以及
iostream.h中的所有类。
在一个程序或一个编译单元(即一个程序文件)中当需要进行标准I/O操作时,则必须包含头文件iostream.h,当需要进行文件I/O操作时,则必须包含头文件fstream.h,同样,当需要进行串I/O操作时,则必须包含头文件strstrea.h。在一个程序或编译单元中包含一个头文件的命令格式为“#include<头文件名>”,当然若头文件是用户建立的,则头文件名的两侧不是使用尖括号,而是使用双引号。当系统编译一个C++文件对#include命令进行处理时,是把该命令中指定的文件中的全部内容嵌入到该命令的位置,然后再编译整个C++文件生成相应的目标代码文件。
C++不仅定义有现成的I/O类库供用户使用,而且还为用户进行标准I/O操作定义了四个类对象,它们分别是cin,cout,cerr和clog,其中cin为istream_withassign流类的对象,代表标准输入设备键盘,也称为cin流或标准输入流,后三个为ostream_withassign流类的对象,cout代表标准输出设备显示器,也称为cout流或标准输出流,cerr和clog含义相同,均代表错误信息输出设备显示器。因此当进行键盘输入时使用cin流,当进行显示器输出时使用cout流,当进行错误信息输出时使用cerr或clog。
在istream输入流类中定义有对右移操作符>>重载的一组公用成员函数,函数的具体声明格式为:
istream& operator>>(简单类型标识符&);
简单类型标识符可以为char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, float, double, long double, char*, signed char*, unsigned char*之中的任何一种,对于每一种类型都对应着一个右移操作符重载函数。由于右移操作符重载用于给变量输入数据的操作,所以又称为提取操作符,即从流中提取出数据赋给变量。
当系统执行cin>>x操作时,将根据实参x的类型调用相应的提取操作符重载函数,把x引用传送给对应的形参,接着从键盘的输入中读入一个值并赋给x(因形参是x的别名)后,返回cin流,以便继续使用提取操作符为下一个变量输入数据。
当从键盘上输入数据时,只有当输入完数据并按下回车键后,系统才把该行数据存入到键盘缓冲区,供cin流顺序读取给变量。还有,从键盘上输入的每个数据之间必须用空格或回车符分开,因为cin为一个变量读入数据时是以空格或回车符作为其结束标志的。
当cin>>x操作中的x为字符指针类型时,则要求从键盘的输入中读取一个字符串,并把它赋值给x所指向的存储空间中,若x没有事先指向一个允许写入信息的存储空间,则无法完成输入操作。另外从键盘上输入的字符串,其两边不能带有双引号定界符,若带有只作为双引号字符看待。对于输入的字符也是如此,不能带有单引号定界符。
在ostream输出流类中定义有对左移操作符<<重载的一组公用成员函数,函数的具体声明格式为:
ostream& operator<<(简单类型标识符);
简单类型标识符除了与在istream流类中声明右移操作符重载函数给出的所有简单类型标识符相同以外,还增加一个void* 类型,用于输出任何指针(但不能是字符指针,因为它将被作为字符串处理,即输出所指向存储空间中保存的一个字符串)的值。由于左移操作符重载用于向流中输出表达式的值,所以又称为插入操作符。如当输出流是cout时,则就把表达式的值插入到显示器上,即输出到显示器显示出来。
当系统执行cout<<x操作时,首先根据x值的类型调用相应的插入操作符重载函数,把x的值按值传送给对应的形参,接着执行函数体,把x的值(亦即形参的值)输出到显示器屏幕上,从当前屏幕光标位置起显示出来,然后返回cout流,以便继续使用插入操作符输出下一个表达式的值。当使用插入操作符向一个流输出一个值后,再输出下一个值时将被紧接着放在上一个值的后面,所以为了让流中前后两个值分开,可以在输出一个值之后接着输出一个空格,或一个换行符,或其他所需要的字符或字符串。

二、 输入输出格式控制

1.ios类中的枚举常量
在根基类ios中定义有三个用户需要使用的枚举类型,由于它们是在公用成员部分定义的,所以其中的每个枚举类型常量在加上ios::前缀后都可以为本类成员函数和所有外部函数访问。在三个枚举类型中有一个无名枚举类型,其中定义的每个枚举常量都是用于设置控制输入输出格式的标志使用的。该枚举类型定义如下:
enum {skipws, left, right, internal, dec, oct, hex, showbase,
showpoint, uppercase, showpos, scientific, fixed, unitbuf, stdio
};
各枚举常量的含义如下:
skipws
利用它设置对应标志后,从流中输入数据时跳过当前位置及后面的所有连续的空白字符,从第一个非空白字符起读数,否则不跳过空白字符。空格、制表符’\t’、回车符’\r’和换行符’\n’统称为空白符。缺省为设置。
left, right, internal
left在指定的域宽内按左对齐输出,right按右对齐输出,而internal使数值的符号按左对齐、数值本身按右对齐输出。域宽内剩余的字符位置用填充符填充。缺省为right设置。在任一时刻只有一种有效。
dec, oct, hex
设置dec对应标志后,使以后的数值按十进制输出,设置oct后按八进制输出,而设置hex后则按十六进制输出。缺省为dec设置。
showbase
设置对应标志后使数值输出的前面加上“基指示符”,八进制数的基指示符为数字0,十六进制数的基指示符为0x,十进制数没有基指示符。缺省为不设置,即在数值输出的前面不加基指示符。
showpoint
强制输出的浮点数中带有小数点和小数尾部的无效数字0。缺省为不设置。
uppercase
使输出的十六进制数和浮点数中使用的字母为大写。缺省为不设置。即输出的十六进制数和浮点数中使用的字母为小写。
showpos
使输出的正数前带有正号“+”。缺省为不设置。即输出的正数前不带任何符号。
scientific, fixed
进行scientific设置后使浮点数按科学表示法输出,进行fixed设置后使浮点数按定点表示法输出。只能任设其一。缺省时由系统根据输出的数值选用合适的表示输出。
unitbuf, stdio
这两个常量很少使用,所以不予介绍。
在ios中定义的第二个枚举类型为:
enum open_mode {in, out, ate, app, trunc, nocreate, noreplace, binany};
其中的每个枚举常量规定一种文件打开的方式,在定义文件流对象和打开文件时使用。
在ios中定义的第三个枚举类型为:
enum seek_dir {beg, cur, end};
其中的每个枚举常量用于对文件指针的定位操作上。

2. ios类中的成员函数
ios类提供成员函数对流的状态进行检测和进行输入输出格式控制等操作,每个成员函数的声明格式和简要说明如下:
int bad(); //操作出错时返回非0值。
int eof(); //读取到流中最后的文件结束符时返回非0值。
int fail(); //操作失败时返回非0值。
void clear(); //清除bad,eof和fail所对应的标志状态,使之恢复为正常状态
//值0,使good标志状态恢复为1。
char fill(); //返回当前使用的填充字符。
char fill(char c); //重新设置流中用于输出数据的填充字符为c的值,返回此
//前的填充字符。系统预设置填充字符为空格。
long flags(); //返回当前用于I/O控制的格式状态字。
long flags(long f); //重新设置格式状态字为f的值,返回此前的格式状态字。
int good(); //操作正常时返回非0值,当操作出错、失败和读到文件结束符时
//均为不正常,则返回0。
int precision(); //返回浮点数输出精度,即输出的有效数字的位数。
int precision(int n); //设置浮点数的输出精度为n,返回此前的输出精度。
//系统预设置的输出精度为6,即输出的浮点数最多
//具有6位为有效数字。
int rdstate(); //操作正常时返回0,否则返回非0值,它与good()正好相反。
long setf(long f); //根据参数f设置相应的格式化标志,返回此前的设置。
//该参数f所对应的实参为无名枚举类型中的枚举常量(
//又称格式化常量),可以同时使用一个或多个常量,每两个
//常量之间要用按位或操作符连接。如当需要左对齐输出,
//并使数值中的字母大写时,则调用该函数的实参为ios::
//left | ios::uppercase。
long unsetf(long f); //根据参数f清除相应的格式化标志,返回此前的设置。
//如要清除此前的左对齐输出设置,恢复缺省的右对齐输出
//设置,则调用该函数的实参为ios::left。
int width(); //返回当前的输出域宽。若返回数值0则表明没有为刚才输出的
//数值设置输出域宽,输出域宽是指输出的值在流中所占有的字节数。
int width(int w); //设置下一个数据值的输出域宽为w,返回为输出上一个数
//据值所规定的域宽,若无规定则返回0。注意:此设置不
//是一直有效,而只是对下一个输出数据有效。
因为所有I/O流类都是ios的派生类,所以它们的对象都可以调用ios类中的成员函数和使用ios类中的格式化常量进行输入输出格式控制。下面以标准输出流对象cout为例说明输出的格式化控制。
程序1:
#include<iostream.h>
void main()
{
int x=30, y=300, z=1024;
cout<<x<<' '<<y<<' '<<z<<endl; //按十进制输出
cout.setf(ios::oct); //设置为八进制输出
cout<<x<<' '<<y<<' '<<z<<endl; //按八进制输出
cout.unsetf(ios::oct);
//取消八进制输出设置,恢复按十进制输出
cout.setf(ios::hex); //设置为十六进制输出
cout<<x<<' '<<y<<' '<<z<<endl; //按十六进制输出
cout.setf(ios::showbase | ios::uppercase);
//设置基指示符输出和数值中的字母大写输出
cout<<x<<' '<<y<<' '<<z<<endl;
cout.unsetf(ios::showbase | ios::uppercase);
//取消基指示符输出和数值中的字母大写输出
cout<<x<<' '<<y<<' '<<z<<endl;
cout.unsetf(ios::hex);
//取消十六进制输出设置,恢复按十进制输出
cout<<x<<' '<<y<<' '<<z<<endl;
}
此程序的运行结果如下:
30 300 1024
36 454 2000
1e 12c 400
0X1E 0X12C 0X400
1e 12c 400
30 300 1024

程序2:
#include<iostream.h>
void main()
{
int x=468;
double y=-3.425648;
cout<<"x=";
cout.width(10); //设置输出下一个数据的域宽为10
cout<<x; //按缺省的右对齐输出,剩余位置填充空格字符
cout<<"y=";
cout.width(10); //设置输出下一个数据的域宽为10
cout<<y<<endl;
cout.setf(ios::left); //设置按左对齐输出
cout<<"x=";
cout.width(10);
cout<<x;
cout<<"y=";
cout.width(10);
cout<<y<<endl;
cout.fill('*'); //设置填充字符为'*'
cout.precision(3); //设置浮点数输出精度为3
cout.setf(ios::showpos); //设置正数的正号输出
cout<<"x=";
cout.width(10);
cout<<x;
cout<<"y=";
cout.width(10);
cout<<y<<endl;
}
此程序运行结果如下:
x= 468y= -3.42565
x=468 y=-3.42565
x=+468******y=-3.43*****

程序3:
#include<iostream.h>
void main()
{
float x=25, y=-4.762;
cout<<x<<' '<<y<<endl;
cout.setf(ios::showpoint); //强制显示小数点和无效0
cout<<x<<' '<<y<<endl;
cout.unsetf(ios::showpoint); //恢复缺省输出
cout.setf(ios::scientific); //设置按科学表示法输出
cout<<x<<' '<<y<<endl;
cout.setf(ios::fixed); //设置按定点表示法输出
cout<<x<<' '<<y<<endl;
}
程序运行结果如下:
25 -4.762
25.0000 -4.76200
2.500000e+001 -4.762000e+000
25 -4.762

3. 格式控制操作符
数据输入输出的格式控制还有更简便的形式,就是使用系统头文件iomanip.h中提供的操纵符。使用这些操纵符不需要调用成员函数,只要把它们作为插入操作符<<(个别作为提取操作符>>)的输出对象即可。这些操纵符及功能如下:
dec //转换为按十进制输出整数,它也是系统预置的进制。
oct //转换为按八进制输出整数。
hex //转换为按十六进制输出整数。
ws //从输入流中读取空白字符。
endl //输出换行符’\n’并刷新流。刷新流是指把流缓冲区的内容立即写入到对
//应的物理设备上。
ends //输出一个空字符’\0’。
flush //只刷新一个输出流。
setiosflags(long f) //设置f所对应的格式化标志,功能与setf(long f)
//成员函数相同,当然输出该操纵符后返回的是一个
//输出流。如采用标准输出流cout输出它时,则返回
//cout。对于输出每个操纵符后也都是如此,即返回
//输出它的流,以便向流中继续插入下一个数据。
resetiosflags(long f) //清除f所对应的格式化标志,功能与unsetf(long f)
//成员函数相同。当然输出后返回一个流。
setfill(int c) //设置填充字符为ASCII码为c的字符。
setprecision(int n) //设置浮点数的输出精度为n。
setw(int w) //设置下一个数据的输出域宽为w。
在上面的操纵符中,dec, oce, hex, endl, ends, flush和ws除了在iomanip.h中有定义外,在iostream.h中也有定义。所以当程序或编译单元中只需要使用这些不带参数的操纵符时,可以只包含iostream.h文件,而不需要包含iomanip.h文件。
下面以标准输出流对象cout为例,说明使用操作符进行的输出格式化控制。
程序4:
#include<iostream.h>
//因iomanip.h中包含有iostream.h,所以该命令可省略
#include<iomanip.h>
void main()
{
int x=30, y=300, z=1024;
cout<<x<<' '<<y<<' '<<z<<endl; //按十进制输出
cout<<oct<<x<<' '<<y<<' '<<z<<endl; //按八进制输出
cout<<hex<<x<<' '<<y<<' '<<z<<endl; //按十六进制输出
cout<<setiosflags(ios::showbase | ios::uppercase);
//设置基指示符和数值中的字母大写输出
cout<<x<<' '<<y<<' '<<z<<endl; //仍按十六进制输出
cout<<resetiosflags(ios::showbase | ios::uppercase);
//取消基指示符和数值中的字母大写输出
cout<<x<<' '<<y<<' '<<z<<endl; //仍按十六进制输出
cout<<dec<<x<<' '<<y<<' '<<z<<endl; //按十进制输出
}
此程序的功能和运行结果都与程序1完全相同。

程序5:
#include<iostream.h>
#include<iomanip.h>
void main()
{
int x=468;
double y=-3.425648;
cout<<"x="<<setw(10)<<x;
cout<<"y="<<setw(10)<<y<<endl;
cout<<setiosflags(ios::left); //设置按左对齐输出
cout<<"x="<<setw(10)<<x;
cout<<"y="<<setw(10)<<y<<endl;
cout<<setfill('*'); //设置填充字符为'*'
cout<<setprecision(3); //设置浮点数输出精度为3
cout<<setiosflags(ios::showpos); //设置正数的正号输出
cout<<"x="<<setw(10)<<x;
cout<<"y="<<setw(10)<<y<<endl;
cout<<resetiosflags(ios::left | ios::showpos);
cout<<setfill(' ');
}
此程序的功能和运行结果完全与程序2相同。

程序6:
#include<iomanip.h>
void main()
{
float x=25, y=-4.762;
cout<<x<<' '<<y<<endl;
cout<<setiosflags(ios::showpoint);
cout<<x<<' '<<y<<endl;
cout<<resetiosflags(ios::showpoint);
cout<<setiosflags(ios::scientific);
cout<<x<<' '<<y<<endl;
cout<<setiosflags(ios::fixed);
cout<<x<<' '<<y<<endl;
}
此程序的功能和运行结果也完全与程序3相同。

三、文件操作

1. 文件的概念
以前进行的输入输出操作都是在键盘和显示器上进行的,通过键盘向程序输入待处理的数据,通过显示器输出程序运行过程中需要告诉用户的信息。键盘是C++系统中的标准输入设备,用cin流表示,显示器是C++系统中的标准输出设备,用cout流表示。
数据的输入和输出除了可以在键盘和显示器上进行之外,还可以在磁盘上进行。磁盘是外部存储器,它能够永久保存信息,并能够被重新读写和携带使用。所以若用户需要把信息保存起来,以便下次使用,则必须把它存储到外存磁盘上。
在磁盘上保存的信息是按文件的形式组织的,每个文件都对应一个文件名,并且属于某个物理盘或逻辑盘的目录层次结构中一个确定的目录之下。一个文件名由文件主名和扩展名两部分组成,它们之间用圆点(即小数点)分开,扩展名可以省略,当省略时也要省略掉前面的圆点。文件主名是由用户命名的一个有效的C++标识符,为了同其他软件系统兼容,一般让文件主名为不超过8个有效字符的标识符,同时为了便于记忆和使用,最好使文件主名的含义与所存的文件内容相一致。文件扩展名也是由用户命名的、1至3个字符组成的、有效的C++标识符,通常用它来区分文件的类型。如在C++系统中,用扩展名h表示头文件,用扩展名cpp表示程序文件,用obj表示程序文件被编译后生成的目标文件,用exe表示连接整个程序中所有目标文件后生成的可执行文件。对于用户建立的用于保存数据的文件,通常用dat表示扩展名,若它是由字符构成的文本文件则也用txt作为扩展名,若它是由字节构成的、能够进行随机存取的内部格式文件则可用ran表示扩展名。
在C++程序中使用的保存数据的文件按存储格式分为两种类型,一种为字符格式文件,简称字符文件,另一种为内部格式文件,简称字节文件。字符文件又称ASCII码文件或文本文件,字节文件又称二进制文件。在字符文件中,每个字节单元的内容为字符的ASCII码,被读出后能够直接送到显示器或打印机上显示或打印出对应的字符,供人们直接阅读。在字节文件中,文件内容是数据的内部表示,是从内存中直接复制过来的。当然对于字符信息,数据的内部表示就是ASCII码表示,所以在字符文件和在字节文件中保存的字符信息没有差别,但对于数值信息,数据的内部表示和ASCII码表示截然不同,所以在字符文件和在字节文件中保存的数值信息也截然不同。如对于一个短整型数1069,它的内部表示占有两个字节,对应的十六进制编码为04 2D,其中04为高字节值,2D为低字节值;若用ASCII码表示则为四个字节,每个字节依次为1069中每个字符的ASCII码,对应的十六进制编码为31 30 36 39。当从内存向字符文件输出数值数据时需要自动转换成它的ASCII码表示,相反,当从字符文件向内存输入数值数据时也需要自动将它转换为内部表示,而对于字节文件的输入输出则不需要转换,仅是内外存信息的直接拷贝,显然比字符文件的输入输出要快得多。所以当建立的文件主要是为了进行数据处理时,则适宜建立成字节文件,若主要是为了输出到显示器或打印机供人们阅读,或者是为了供其他软件使用时,则适宜建立成字符文件。另外,当向字符文件输出一个换行符’\n’时,则将被看作为输出了回车’\r’和换行’\n’两个字符;相反,当从字符文件中读取回车和换行两个连续字符时,也被看作为一个换行符读取。
C++程序文件,利用其他各种语言编写的程序文件,用户建立的各种文本文件,各种软件系统中的帮助文件等,因都是ASCII码文件,所以都可以在C++中作为字符文件使用。
C

2. C++文件流的C++ 中 *fstream 操作

在fstream类中,有一个成员函数open(),就是用来打开文件的,其原型是: voidopen(constchar*filename,intmode,intaccess);参数: filename:要打开的文件名mode:要打开文件的方式access:打开文件的属性打开文件的方式在类ios(是所有流式I/O类的基类)中定义,常用的值如下: ios::app:以追加的方式打开文件ios::ate:文件打开后定位到文件尾,ios:app就包含有此属性ios::binary:以二进制方式打开文件,缺省的方式是文本方式。两种方式的区别见前文ios::in:文件以输入方式打开ios::out:文件以输出方式打开ios::nocreate:不建立文件,所以文件不存在时打开失败ios::noreplace:不覆盖文件,所以保存文件时如果文件存在失败ios::trunc:如果文件存在,把文件长度设为0可以用“或”把以上属性连接起来,如ios::out|ios::binary
// 注:新的C++标准库不支持nocreate和noreplace,以前的旧版本可以用.
打开文件的属性取值是: 0:普通文件,打开访问1:只读文件2:隐含文件4:系统文件可以用“或”或者“+”把以上属性连接起来 ,如3或1|2就是以只读和隐含属性打开文件。
例如:以二进制输入方式打开文件c:config.sys fstreamfile1;file1.open(c:config.sys,ios::binary|ios::in,0);如果open函数只有文件名一个参数,则是以读/写普通文件打开,即: file1.open(c:config.sys);<=>file1.open(c:config.sys,ios::in|ios::out,0);另外,fstream还有和open()一样的构造函数,对于上例,在定义的时候就可以打开文件了: fstreamfile1(c:config.sys);特别提出的是,fstream有两个子类:ifstream(input file stream)和ofstream(output file stream),ifstream默认以输入方式打开文件,而ofstream默认以输出方式打开文件。 ifstreamfile2(c:pdos.def);//以输入方式打开文件ofstreamfile3(c:x.123);//以输出方式打开文件所以,在实际应用中,根据需要的不同,选择不同的类来定义:如果想以输入方式打开,就用ifstream来定义;如果想以输出方式打开,就用ofstream来定义;如果想以输入/输出方式来打开,就用fstream来定义。
包含:
需要在文件中包含<fstream>,即: #include<fstream>后面可以加using namespace std;程序里就可以直接用fstream类及其函数了。
或者在具体使用时用std::来标识,如:std::fstream file1;
例如:fstream file; file.open(filename.txt,ios::out); 读写文件分为文本文件和二进制文件的读取,对于文本文件的读取比较简单,用插入器和析取器就可以了;而对于二进制的读取就要复杂些,下面就详细的介绍这两种方式
1、文本文件的读写
文本文件的读写很简单:用插入器(<<)向文件输出;用析取器(>>)从文件输入。假设file1是以输入方式打开,file2以输出打开。示例如下:
file2<<I Love You;//向文件写入字符串I Love You
int i;
file1>>i;//从文件输入一个整数值。
这种方式还有一种简单的格式化能力,比如可以指定输出为16进制等等,具体的格式有以下一些
操纵符 功能 输入/输出 dec格式化为十进制数值数据输入和输出endl输出一个换行符并刷新此流输出ends输出一个空字符输出hex格式化为十六进制数值数据输入和输出oct格式化为八进制数值数据输入和输出//setpxecision(intp)设置浮点数的精度位数输出setprecision(intp)设置浮点数的精度位数输出(setpxecision应该为setprecision,使用时需要包含头文件:#include <iomanip.h>)
//比如要把123当作十六进制输出:file1<<hex<<123;要把3.1415926以5位精度输出:file1<<setprecision(5)<<3.1415926。
2、二进制文件的读写
①put()
put()函数向流写入一个字符,其原型是ofstream &put(char ch),使用也比较简单,如file1.put('c');就是向流写一个字符'c'。
②get()
get()函数比较灵活,有3种常用的重载形式:
一种就是和put()对应的形式:ifstream &get(char &ch);功能是从流中读取一个字符,结果保存在引用ch中,如果到文件尾,返回空字符。如file2.get(x);表示从文件中读取一个字符,并把读取的字符保存在x中。
另一种重载形式的原型是: int get();这种形式是从流中返回一个字符,如果到达文件尾,返回EOF,如x=file2.get();和上例功能是一样的。
还有一种形式的原型是:ifstream &get(char *buf,int num,char delim='n');这种形式把字符读入由 buf 指向的数组,直到读入了 num 个字符或遇到了由 delim 指定的字符,如果没使用 delim 这个参数,将使用缺省值换行符'n'。例如:
file2.get(str1,127,'A');//从文件中读取字符到字符串str1,当遇到字符'A'或读取了127个字符时终止。
③读写数据块
要读写二进制数据块,使用成员函数read()和write()成员函数,它们原型如下:
read(unsigned char *buf,int num);
write(const unsigned char *buf,int num);
read()从文件中读取 num 个字符到 buf 指向的缓存中,如果在还未读入 num 个字符时就到了文件尾,可以用成员函数 int gcount();来取得实际读取的字符数;而 write() 从buf 指向的缓存写 num 个字符到文件中,值得注意的是缓存的类型是 unsigned char *,有时可能需要类型转换。
例: unsignedcharstr1[]=ILoveYou;intn[5];ifstreamin(xxx.xxx);ofstreamout(yyy.yyy);out.write(str1,strlen(str1));//把字符串str1全部写到yyy.yyy中in.read((unsignedchar*)n,sizeof(n));//从xxx.xxx中读取指定个整数,注意类型转换in.close();out.close(); iostatevalue(member
constant) indicatesfunctions to
check state
flags good()eof()fail()bad()rdstate()goodbitNo errors (zero valueiostate)-of-File reached on input error on i/o /writing error on i/o
operation falsefalsetruetruebadbit 成员函数eof()用来检测是否到达文件尾,如果到达文件尾返回非0值,否则返回0。原型是int eof();
例: if(in.eof())ShowMessage(已经到达文件尾!);
出现eof标志如果用clear(),eof标志会被清除,这时需要手动检查或在下一次操作时重新置位
手动检查 autolastpos=in,tellg();in.seekg(0,ios::end);autoendpos=in.tellg();in.seekg(lastpos); 和C的文件操作方式不同的是,C++ I/O系统管理两个与一个文件相联系的指针。一个是读指针,它说明输入操作在文件中的位置;另一个是写指针,它下次写操作的位置。每次执行输入或输出时,相应的指针自动变化。所以,C++的文件定位分为读位置和写位置的定位,对应的成员函数是 seekg()和 seekp(),seekg()是设置读位置,seekp是设置写位置。
使用seekg和seekp时移动的是同一个指针,可以通过下面程序检测 fstreamfile;//需要保证文件一定打开成功file.open(1.txt,ios::binary|ios::trunc|ios::in|ios::out);file.write(ABCDEFGHIJ,10);//写指针应该是10printf(%u ,(size_t)file.tellp());//设置读指针为0file.seekg(0,ios::beg);//可以发现写指针变成0了printf(%u ,(size_t)file.tellp());seekg()和seekp()返回的流尚未研究,尚不清楚与本体的关系,需后来人补充tellp或tellg()返回的值不能直接使用,必须转换为C++基本值 size_tpos1=file.tellg().seekpos();//或size_tpos2=(size_t)file.tellg();它们最通用的形式如下: istream&seekg(streamoffoffset,seek_dirorigin);ostream&seekp(streamoffoffset,seek_dirorigin);streamoff定义于 iostream.h 中,定义有偏移量 offset 所能取得的最大值,seek_dir 表示移动的基准位置,是一个有以下值的枚举: ios::beg:文件开头ios::cur:文件当前位置ios::end:文件结尾这两个函数一般用于二进制文件,因为文本文件会因为系统对字符的解释而可能与预想的值不同。
例: file1.seekg(1234,ios::cur);//把文件的读指针从当前位置向后移1234个字节file2.seekp(1234,ios::beg);//把文件的写指针从文件开头向后移1234个字节如果vc编程的话最好使用CFile类等更加方便于文件操作</CA> stream的声明里面是将拷贝构造函数声明为非public的,应此在将stream作为函数参数传递时应该使用引用或者指针,而非值传递。
例如: voidfn(streamin);这样的声明在编译时无问题,但是在使用时即会提示错误,应该修改为 voidfn(stream&in);

3. c++ 关于ofstream,急急在线等,十分着急,就剩这些分数,全给了

#include <iostream>
#include <fstream>
using namespace std;

应该放在"huffman.h"文件
在main()函数的文件中就加这个"huffman.h"头文件

4. ofstream 帮帮忙,这个编译时可以,可是运行时就说是内存不足,怎么回事啊

char* 的初始化,这里的问题:

name=NULL;
sex=NULL;

改为
name="";
sex="";

或者

name="\0";
sex="\0";

5. ofstream应该如何构造

你没有加头文件
#include <fstream>

6. 请问能否在C++中定义一个ofstream的全局变量以在所有cpp文件中都能使用同一个

这个标准的做法是先做一个.h文件(如my_ext.h),在.h中声明一个全局的外部变量externofstreammy_ofstream;然后在一个.cpp中定义它(如my_ext.cpp)ofstreammy_ofstream;最后在你要用的.cpp中,include自己写的头文件,并将my_ext.cpp加入你的工程这样就可以了如果你要像系统的函数或变量一样,所有的.cpp都能使用,只要加个include那你就需要做一个静态库了(各个编译器的方法各不相同)

7. c++ifstream对象初学问题 void begin(ofstream &fl){······};

把所有的代码都打出来吧

8. C++里面的iostream是什么东西

C++编译系统提供了用于输入输出的iostream类库。iostream这个单词是由3个部分组成的,即i-o-stream,意为输入输出流。在iostream类库中包含许多用于输入输出的类。

ios是抽象基类,由他派生出istream类和ostream类,两个类名中第一个字母i和o分别代表输入(input)和输出(output)。isrream类支持输入操作,ostream类支持输出操作,iostream支持输入输出操作。iostream是从istreanm类和ostream类通过多重继承而派生的类。


C++对文件的输入输出需要用ifstream和ofstream类,两个类名中第一个字母i和o分别代表输入输出,第二个字母f代表文件(file)。ifstream支持对文件的输入操作,ofstream支持对文件的输出操作。类ifstream继承了istream,类ofstream继承了ostream,类fstream继承了iostream。


#include<iostream>的意思提供iostream库中的信息,在程序开头写上这个才可以直接调用iostream类库中的函数

9. C++ ofstream对象打开是否成功的判断

qqq应该是个指针(以下都是个人推测)
如果打开文件成功,则qqq是一个指向该文件的指针,其值不会是0
如果打开文件失败,则qqq会是NULL,从数值上来说,就是个0
false从数值上来说表示0 true表示1
所以,qqq==false没错,qqq==true却会报错 C++编译器就是这样设计的。不要管为什么了。一定要学会正确使用就可以了。

阅读全文

与ofstream编译系统相关的资料

热点内容
rplsp文件夹能删除吗 浏览:249
分数的算法有哪几种 浏览:918
有序链表合并java 浏览:750
吃麻辣烫的程序员 浏览:811
公司研报一般用什么app看 浏览:35
新买的汽车模块还要编程吗 浏览:943
cnc编程入门自学 浏览:835
编译器怎么检查重新编译 浏览:664
pdf重排安卓 浏览:247
linux设置自动重启 浏览:223
桂林市php高级程序员招聘 浏览:682
安卓机信号图标怎么美化 浏览:322
安装包帧数文件夹 浏览:840
算法可以采用哪三种方式来描述 浏览:283
金立m6加密芯片 浏览:865
为什么ted的app没有图像 浏览:428
itext对pdf签名 浏览:666
vcc如何编译 浏览:412
java环境变量classpath 浏览:607
知乎编程入门指南 浏览:179