ostream提供了数据流输出的功能(c++中文件的读入和输出是怎么样的)
本文目录
c++中文件的读入和输出是怎么样的
在C++中,有一顷老个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O,stream这个类有两个重要的运算符: 1、插入器(《《) 向流输出数据。比如说系统有一个默认的标准输出流(cout),一般情况下就是指的显示器,所以,cout《《"Write Stdout"《《’\n’;就表示把字符串"Write Stdout"和换行字符(’\n’)输出到标准输出流。2、析取器(》》) 从流中输入数陪纯据。比如说系统有一个默认的标准输入流(cin),一般情况下就雀乱升是指的键盘,所以,cin》》x;就表示从标准输入流中读取一个指定类型(即变量x的类型)的数据。 在C++中,对文件的操作是通过stream的子类fstream(file stream)来实现的,所以,要用这种方式操作文件,就必须加入头文件fstream.h。下面就把此类的文件操作过程一一道来。一、打开文件 在fstream类中,有一个成员函数open(),就是用来打开文件的,其原型是:void open(const char* filename,int mode,int access);参数: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 打开文件的属性取值是:0:普通文件,打开访问 1:只读文件 2:隐含文件 4:系统文件 可以用“或”或者“+”把以上属性连接起来 ,如3或1|2就是以只读和隐含属性打开文件。 例如:以二进制输入方式打开文件c:\config.sys fstream file1;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()一样的构造函数,对于上例,在定义的时侯就可以打开文件了:fstream file1("c:\\config.sys"); 特别提出的是,fstream有两个子类:ifstream(input file stream)和ofstream(outpu file stream),ifstream默认以输入方式打开文件,而ofstream默认以输出方式打开文件。ifstream file2("c:\\pdos.def");//以输入方式打开文件ofstream file3("c:\\x.123");//以输出方式打开文件 所以,在实际应用中,根据需要的不同,选择不同的类来定义:如果想以输入方式打开,就用ifstream来定义;如果想以输出方式打开,就用ofstream来定义;如果想以输入/输出方式来打开,就用fstream来定义。二、关闭文件 打开的文件使用完成后一定要关闭,fstream提供了成员函数close()来完成此操作,如:file1.close();就把file1相连的文件关闭。三、读写文件 读写文件分为文本文件和二进制文件的读取,对于文本文件的读取比较简单,用插入器和析取器就可以了;而对于二进制的读取就要复杂些,下要就详细的介绍这两种方式 1、文本文件的读写 文本文件的读写很简单:用插入器(《《)向文件输出;用析取器(》》)从文件输入。假设file1是以输入方式打开,file2以输出打开。示例如下: file2《《"I Love You";//向文件写入字符串"I Love You" int i; file1》》i;//从文件输入一个整数值。 这种方式还有一种简单的格式化能力,比如可以指定输出为16进制等等,具体的格式有以下一些操纵符 功能 输入/输出 dec 格式化为十进制数值数据 输入和输出 endl 输出一个换行符并刷新此流 输出 ends 输出一个空字符 输出 hex 格式化为十六进制数值数据 输入和输出 oct 格式化为八进制数值数据 输入和输出 setpxecision(int p) 设置浮点数的精度位数 输出 比如要把123当作十六进制输出:file1《《hex《《123;要把3.1415926以5位精度输出:file1《《setpxecision(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 *,有时可能需要类型转换。例: unsigned char str1="I Love You"; int n; ifstream in("xxx.xxx"); ofstream out("yyy.yyy"); out.write(str1,strlen(str1));//把字符串str1全部写到yyy.yyy中 in.read((unsigned char*)n,sizeof(n));//从xxx.xxx中读取指定个整数,注意类型转换 in.close();out.close(); 四、检测EOF 成员函数eof()用来检测是否到达文件尾,如果到达文件尾返回非0值,否则返回0。原型是int eof();例: if(in.eof()) ShowMessage("已经到达文件尾!");五、文件定位 和C的文件操作方式不同的是,C++ I/O系统管理两个与一个文件相联系的指针。一个是读指针,它说明输入操作在文件中的位置;另一个是写指针,它下次写操作的位置。每次执行输入或输出时,相应的指针自动变化。所以,C++的文件定位分为读位置和写位置的定位,对应的成员函数是seekg()和seekp()。seekg()是设置读位置,seekp是设置写位置。它们最通用的形式如下: istream &seekg(streamoff offset,seek_dir origin); ostream &seekp(streamoff offset,seek_dir origin); streamoff定义于 iostream.h 中,定义有偏移量 offset 所能取得的最大值,seek_dir 表示移动的基准位置,是一个有以下值的枚举:ios::beg: 文件开头ios::cur: 文件当前位置ios::end: 文件结尾 这两个函数一般用于二进制文件,因为文本文件会因为系统对字符的解释而可能与预想的值不同。例: file1.seekg(1234,ios::cur); //把文件的读指针从当前位置向后移1234个字节 file2.seekp(1234,ios::beg); //把文件的写指针从文件开头向后移1234个字节 有了这些知识,我们就可以完成对文件的操作了,当然,还有好多的成员函数我没介绍,但有这些我们已经能完成大多数的需要了,这种文件操作方式是我比较喜欢的一种方法,比C的方法灵活,又比WinAPI函数具有通用性。
c语言中的头文件
c语言中的头文件:#include《stdio.h》。
头文件的作用:
1.头文件可以定义所用的函数列表,方便查阅你可以调用的函数。
2.头文件可以定义很多宏定义,就是一些全局静态变量的定义,在这样的情况下,只要修改头文件的内容,程序就可以做相应的修改,不用亲自跑到繁琐的代码内去搜索。
3.头文件只是声明,不占内存空间,要知道其执行过程,要看你头文件所申明的函数是在哪个.c文件里定义的,才知道。
拓展资料:
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
什么是http输出流它的作用是什么它的格式是什么
***隐藏网址***文件流:fstream头文件中定义了三种支持文件IO的类型:(1)ifstream, 由istream派生而来,提供读文件的功能;(2)ofstream, 由ostream派生而来,提供写文件的功能;(3)fstream, 由iostream派生而来,提供读写同一文件的功能.fstream类型定义了两个自己的新操作:open, close.还定义了一个构造函数,其形参为要打开的文件的文件名.文件流对象的使用举例:(1).以构造函数初始化流对象 string ifile("in.txt"); string ofile("out.txt"); ifstream infile(ifile.c_str()); ofstream outfile(ofile.c_str());(2).用open函数将流捆绑到要计读写的对象 ifstream infile; ofstream outfile; infile.open("in"); outfile.open("out");检查流(1)文件打开是否成功if(!infile){cerr《《"error:onable to open input file:"《《ifile《《endl;return -1;}(2)输出流是否可用if(!outfile)...将文件流与新文件重新捆绑ifstream infile("in");infile.close();//关闭流infile.clear();//清除流的状态infile.open("next");文件模式in 以读打开 out 以写打开 app 在每次打开之前找到文件尾 ate 打开文件后立即将文件定位在文件尾 trunc(truncated,意:被删节了的) 打开文件时清空已存在的文件流(即清空文件) binary 以二进制模式进行IO操作out, trunc, app :只能用于指定与ofstream 或 fstream对象关联的文件;in :只能用于指定与ifstream 或 fstream对象关联的文件;ate, binary :所有文件皆可.ate:只在打开时有效,文件打开后将定位在文件尾.binary:将文件以字节序列的形式处理,而不解释流中的字符.默认情况:(1)与ifstream流对象关联的文件将以in模式打开;(2)与ofstream流对象关联的文件将以out模式打开,以out模式打开的文件会被清空,丢弃该文件存储的所有数据;(3)与fstream流关联的对象以in和out模式同时打开,此时文件不清空.如果打开fstream所关联的对象时,只使用了out模式,而不指定in模式,则文件会清空已存在的数据.如果打开文件时指定也trunc模式,则无论是否同时指定了in模式,文件同样会被清空.模式是文件的属性而不是流的属性每次打开文件时都会设置模式.打开模式的有效组合out 打开文件做写操作,删除文件中已有的数据 out | app 打开文件做写操作,在文件尾写入. out | trunc 与out模式相同 in 打开文件做读操作 in | out 打开文件做读, 写操作,并定位于文件开头处 in | out | trunc 打开文件做读, 写操作,删除文件中已有的数据上述所有模式组合都可以添加ate模式,对这些模式添加ate只会改变文件打开时的初始定位,在第一次读或与之前,将文件定位于文件末尾处.文件的随机读/写在缺少情况下,文件以写方式打开时,文件指针总是指向文件尾;以读方式打开时,文件指针总是指向文件首.并且总是每读几个字符,文件指针后移几个字符位置.为了增加对文件访问的灵活性,C++在istream类和ostream类中定义了与在输入/输出流中随机移动文件指针相关的三对成员函数.其功能是:(1)文件指针的随机偏移istream & istream::seekg(streamoff, seek_dir);ostream & ostream::seekp(streamoff, seek_dir);C++中偏移量定义语句为:typedef long streamoff;偏移参照位置:三种:beg(文件首), end(文件尾), cur(当前指针).例:fstream f; f.seekp(0, ios::beg);//将文件指针指向文件首.(2)测试文件指针当前位置原型为:istream::tellg();ostream::tellp();例:fstream f;streampos pos = f.tellp();(3)文件指针的绝对位移文件指针绝对位移是给出文件指针的绝对地址.(从文件首算起)C++中,文件指针绝对地址定义为streampos型.定义为:typedef long streampos;函数原型:istream & istream::seekg(streampos);ostream & ostream::seekp(streampos);使用举例:streampos pos = f.tellp();f.seekg(pos);
C++引入了I/O流实现输入输出,与 C语言相比,这种输入输出方法有哪些优点
1、C++流类库和C语言的I/O操作相比:(1) 简明与可读性从直观上来看,C++的这种改变使得I/O 语句更为简明,增加了可读性。用I/O运算符(提取运算符》》和插入运算符《《)代替不同的输入输出函数名(如printf,scanf 等)是一个大的改进。如:printf("n=%d,a=%f\n",n,a);cout《《"n="《《n《《",a="《《a《《endl;(2) 类型安全(type safe)所谓类型安全,是指在进行I/O 操作时不应对于参加输入输出的数据在类型上发生不应有的变化。如:show(int color,float size){cout《《"color="《《color《《",size="《《size《《endl;}在这个函数的调用过程中,系统(编译器)将自动按参数的类型定义检查实参的表达式,显示的结果中,第一个自然是整数值,第二个size 必然是浮点类型值。如果采用printf()函数,由于其参数中的数据类型必须由程序员以参数格式%d,%f,%c,%s 的形式给出,同样实现上述函数show(),就可能产生编译器无法解决的问题:show(int color,float size){printf("color=%f,size=%d\n",color,size);}程 序员在确认输出数据类型时发生错误是可能的,这时输出数据的类型:color 是int 型,size 是float 型,与printf()中给出的参 数格式符%f 对应color,%d 对应于size,两者发生了矛盾。因此说,它是类型不安全的。而C++的I/O系统不会出现这种情形。(3) 易于扩充在 C++语言所附的I/O 系统,在其流类的定义中,把原来C++语言中的左、右移位运算符《《和》》,通过运算符重载的方法,定 义为插入(输出)和提取(输入)运算符。这就为输入输出功能对于各种用户定义的类型数据的扩充,创造了方便的条件。而在stdio.h 文件中说明的 printf()函数却很难做到这一点。例如在C++语言提供的I/O 系统中,它是把运算符‘《《’的重载函数作为输出流类 ostream 的成员函数来定义的,分别对字符串char,short,int,long,float,double,const void *(指 针)等类型作了说明。在此基础上,用户不难对于新的类型数据的输出来重载运算符‘《《’。它可以作为用户定义的类型(例如类complex) 的友元函数来定义:friend ostream &operator《《(ostream &s,complex &c){s《《’(’《《c.re《《’,’《《c.im《《’)’;return s;}2、文件和流 文 件分为文本文件和二进制文件,前者以字节(byte)为单位,每字节对应一ASCII 码,表示一个字符,故又称字符文件。二进制文件以字位(bit)为 单位,实际上是由0 和1 组成的序列。例如整数1245 以文本形式存储占用四个字节,以二进制形式存储则可能只占用两个字节(16 bits)。在程序中,文件的概念不单是狭义地指硬盘上的文件,所有的有输入输出功能的设备,例如键盘,控制台,显示器,打印机都被视为文件。这就是广义的文件的概念。就输入输出操作来说,这些外设和硬盘上的文件是一致的,对于程序员来说文件只与信息的输入输出相关,而且这种输入输出是串行序列形式的。于是,人们把文件的概念抽象为“流”(stream)。流是程序设计对I/O 系统中文件的抽象。一个输入文件,它可能是一个只读磁盘文件,也可能是键盘,一律把它视为流的“源”。而一个输出文件则称为流的“汇”。C++的I/O 系统,定义了一系列由某种继承派生关系的流类,并为这些抽象的流类定义一系列的I/O 操作函数,当需要进行实际的I/O 操作时,只需创建这些类的对象(称为流),并令其与相应的物理文件(硬盘文件名或外设名)相联系。因此,文件可以说是个物理概念,而流则是一个逻辑概念。I/O 操作是针对抽象的流来定义的,对文件的I/O 操作,其前提是把该文件与一个(对象)流联系起来,这是C++的I/O 系统的基本原理。在内存中开辟一片区域作为输入输出操作的缓冲区,可以提高运行效率,因此I/O 操作可以区分缓冲I/O 和非缓冲I/O。严格地说,C++的I/O 系统并不是C++语言的一部分,它是系统为用户提供专用于I/O 的标准类(及函数,对象)等。作为基本类的主要几个类在头文件iostream.h 中被说明。下面将其中几个主要类的内容作一简介。· ios 类:在其中以枚举定义方式给出一系列与I/O 有关的状态标志,工作方式等常量,定义了一系列涉及输入输出格式的成员函数(包括设置域宽,数据精度等),它的一个数据成员是流的缓冲区指针。同时,类ios 作为蓄积类派生了输入流类istream 和输出流类ostream。· streambuf 类,负责管理流的缓冲区。包括负责设置缓冲区和在缓冲区与输入流和输出流之间存取字符的操作的成员函数。· istream 类和ostream 类除继承了类ios 的成员之外,主要为C++的系统数据类型分别对于运算符‘》》’和‘《《’进行重载。· iostream 类以istream 和ostream 为基类,它同时继承二者,以便创建可以同时进行I/O 操作的流。· istream-withassign 类是istream 的派生类,主要增加了输入流(对象)之间的赋值(‘=’)运算。· ostream-withassign 类是ostream 的派生类,主要增加了输出流(对象)之间的赋值(‘=’)运算。· iostream-withassign 类是iostream 的派生类。streambnf 类 与ios 类之间没有继承关系,当I/O操作需要使用I/O 缓冲区时,可以创建缓冲区对象,通过流的缓冲区指针,来完成有关缓冲区的操作。 大多数I /O 操作的函数包括在ios 类和istream 类,ostream 类,iostream 类中。名字带有“withassign”的三个类,实际 上是补充了流对象的赋值操作。由此也可以看到,具有层次关系的类说明的灵活性。在头文件iostream.h 中,除了类的定义之外,还包括四个对象的说 明,它们被称为标准流,或预定义流。· cin 是类istream-withassign 的对象,为标准输入流,在不作其它说明条件下,与标准输入设备(一般指键盘)相关联。· cout 是类ostream-withassign 的对象,为标准输出流,在不作其它说明条件下,与标准输出设备(显示器)相关联。· cerr,clog 也 是类ostream-withassign 的对象,与标准(错误)输出设备(显示器)相关联,前者为非缓冲方式,后者为缓冲方式。一般说来,未作说明的 流是缓冲的。若令cerr 为非缓冲的流,可以保证出现错误后立即把出错信息在显示器上输出。附:istrstream 类1、功能简介:istrstream 类是从 istream 类派生的,它是用来将文本项转换为变量所需要的内部格式。istrstream 类的构造函数有两个:istrstream::istrstream(char *s);istrstream::istrstream(char *s,int n);参数说明:⒈第一个参数 s 是一个字符指针或字符数组,使用该串来初始化要创建的流对象。⒉ n 表示使用前 n 个字符来构造流对象。2、用法心得:istrstream 用来构造一个用于输入的字符串流。可以像cin一样用 。在istrstream流中,以空格为分割符。3.具体例子:例一:先将字符串的值初始化到流对象ins中,然后分别赋给三个变量中。它们以空格为分割符。#include 《iostream》#include 《strstream》using namespace std;int main(){char s = "Uno 2 3.00";istrstream ins(s); int i;char str;float f; ins 》》 str; //str’s value is Unoins 》》 i; //i’s value is 2cout 《《 str 《《 " " 《《 i 《《 endl; ins 》》 f; //f’s value is 3cout 《《 f 《《 ’\n’;return 0;}