C与C++中IO流的比较
2017-04-28 14:01
627 查看
Istream中一些非常用但很有用的函数。
我们常使用>>, getline(),但是其实istream这个类型是提供了很多的其他很有用的函数。
我们知道使IO行为成为一种流的方式最本质的特征就是模拟数据向水一样从一个地方流像另外一个地方,所以我们使用>>, getline()操作的时候,就好像前面被操作的数据没有了。其实像istream这样的对象时刻维护着一个指针(streampos),它一般随着对该流的操作而变动,这样就给我们提供了向流水一样的数据传输,但实际上只是有个指针在作用而已。
有了这个概念我们就知道了,在IOstream library中,有streamoff,streampos,streamsize,这样的int类型的类型来特别表达有关流的当前操作位置以及长度问题。然后我们知道我们可以通过这些对象给与的一些函数做一些相应的我们要做的是,改变流当前位置。
(1)Streamsize gcount(),返回前一次操作的长度。 (2)取得相应个数的字符int get();一个字符istream& get ( char& c );一个字符,存储在c中,返回已经移动了的istreamistream& get ( char* s, streamsize n );n字符,结束字符\n(结束字符不会被取出。istream& get ( char* s, streamsize n, char delim );结束字符delimistream& get ( streambuf& sb);istream& get ( streambuf& sb, char delim ); (3)istream& getline (char* s, streamsize n );
(4)去除n字符(取出,丢弃)
(5)
与get不同在于streampos不会发生变化。
(9)返回当前streampos常用来,计算长度。
对应istream,ostream也有一类函数共使用。
(1) put(对应于get)
如上所说的这些操作,集中在流的get pointer的操作。一句话,对流的操作不会真的将数据流走,只是get pointer的变动而以。
输入输出流会有一个streambuf对象,这个东西非常重要,这些流数据的缓冲地,很多流操作都是以这个对象的操作为基础的!
有人说cstdio,与iostream是对应的,对的,但是他们两之间只是从功能上对应的,实现的方法上确实相差太多了。
Functions
Operations on files:
File access:
Formatted input/output:
Character input/output:
Direct input/output:
File positioning:
Error-handling:
Macros
And also
_IOFBF,
_IOLBF,
_IONBF,
BUFSIZ,
FOPEN_MAX,
L_tmpnam,
SEEK_CUR,
SEEK_END and
SEEK_SET, each described with its corresponding function.
Types
可以看到,在C中由于没有类的概念,顶多只有type,于是所有的方法都是纯方法,并没有类对象的依托,这是cstdio,与iostream.fstream.sstream之间的区别。
不过,cstdio仍然为我们提供了一些非常有用和底层的函数。
(1)前面介绍iostream时我们说再C IO中,只有对设备和文件的两种IO。是的。于是首先操作文件是cstdio的一个很大部分的功能,这里操作文件与使用流的方式读文件的数据无关。
包括删除、新建、重命名等等。
(2)格式化输入输出printf,scanf这样的函数则是我们常见的一种输入输入方法,格式一词体现了他们与纯输入输出(只是将数据都出来,以字节为单位)。
Printf,sanf这样这是一个特殊的专门用于给stdin和stdout输入输出。
Fprintf,fsanf这样的则是为一般的刘进行输入输出的。
Sprint,ssanf这样的这时面向字符串的输入输出(或许这里就是C++建立string流的灵感)。
还有vfprintf,vspintf,vprintf。这样的可以写一个列表的。
(3)除了上面对各种类型数据的格式化输入输出,还有针对字符串输入输出。
其中的函数基本与格式化输入输出对应。
(4)非格式化的,也就是直接写读的方法fread,fwrite。
这些方法其实都是针对文件的(文件包括设备),所以以stdio中以f开头的都是这一类,它们将文件看成一种流的格式( 不想C++那样需要特意声明出一个流对象)。
(5)与C++中一样,流是一种错觉,只是安排了某种特殊的指使位置来做到这一点,在C++中这种指示叫着,get pointer,在C中叫着position。
(6)与C++中流对象的三种状态(eof,bad,fail)以及状态操作对应,C中也有类似的方法来操作流的状态。
转载:刻卜浪兴的博客
我们常使用>>, getline(),但是其实istream这个类型是提供了很多的其他很有用的函数。
我们知道使IO行为成为一种流的方式最本质的特征就是模拟数据向水一样从一个地方流像另外一个地方,所以我们使用>>, getline()操作的时候,就好像前面被操作的数据没有了。其实像istream这样的对象时刻维护着一个指针(streampos),它一般随着对该流的操作而变动,这样就给我们提供了向流水一样的数据传输,但实际上只是有个指针在作用而已。
有了这个概念我们就知道了,在IOstream library中,有streamoff,streampos,streamsize,这样的int类型的类型来特别表达有关流的当前操作位置以及长度问题。然后我们知道我们可以通过这些对象给与的一些函数做一些相应的我们要做的是,改变流当前位置。
(1)Streamsize gcount(),返回前一次操作的长度。 (2)取得相应个数的字符int get();一个字符istream& get ( char& c );一个字符,存储在c中,返回已经移动了的istreamistream& get ( char* s, streamsize n );n字符,结束字符\n(结束字符不会被取出。istream& get ( char* s, streamsize n, char delim );结束字符delimistream& get ( streambuf& sb);istream& get ( streambuf& sb, char delim ); (3)istream& getline (char* s, streamsize n );
istream& getline (char* s, streamsize n, char delim );
(4)去除n字符(取出,丢弃)
istream& ignore ( streamsize n = 1, int delim = EOF );
(5)
int peek ( );
与get不同在于streampos不会发生变化。
(6)退回一个stream指针streampos
istream& putback ( char c );
istream& unget ( );
(7)读n个字符,(与get的区别)。
istream& read ( char* s, streamsize n );
streamsize readsome ( char* s, streamsize n );
(8)设置streampos
istream& seekg ( streampos pos );
istream& seekg ( streamoff off, ios_base::seekdir dir );
value | offset is relative to... |
ios_base::beg | beginning of the stream buffer |
ios_base::cur | current position in the stream buffer |
ios_base::end | end of the stream buffer |
streampos tellg ( );
(10)int sync ( );
可以看出,只有>>, get, read, getline(),这样的函数用于流数据,peek也是知识get pointer不会变。
操作get pointer的有gcount(),ignore,putback,unget,seekg,tellg。
对应istream,ostream也有一类函数共使用。
(1) put(对应于get)
ostream& put ( char c );
注意在输出流中,那个位置指针时put point。指针指向的是输出目的文件接受字符的开始位置,要不然会将前面的字符覆盖。
(2) write(对应于read)
ostream& write ( const char* s , streamsize n );
write没有那么丰富的重载,这表明从一个文件复制数据到另外一个文件只能使用字符数做中间转接。
(3) seekp,tellp,(对应seekg,tellg)g表示get,p表示put。
(4) flush,特殊方法,将缓冲区中的数据写入目的流。
如上所说的这些操作,集中在流的get pointer的操作。一句话,对流的操作不会真的将数据流走,只是get pointer的变动而以。
输入输出流会有一个streambuf对象,这个东西非常重要,这些流数据的缓冲地,很多流操作都是以这个对象的操作为基础的!
有人说cstdio,与iostream是对应的,对的,但是他们两之间只是从功能上对应的,实现的方法上确实相差太多了。
Functions
Operations on files:
remove | Remove file (function ) |
rename | Rename file (function ) |
tmpfile | Open a temporary file (function) |
tmpnam | Generate temporary filename (function) |
fclose | Close file (function) |
fflush | Flush stream (function) |
fopen | Open file (function ) |
freopen | Reopen stream with different file or mode (function ) |
setbuf | Set stream buffer (function ) |
setvbuf | Change stream buffering (function ) |
fprintf | Write formatted output to stream (function) |
fscanf | Read formatted data from stream (function ) |
printf | Print formatted data to stdout (function ) |
scanf | Read formatted data from stdin (function ) |
sprintf | Write formatted data to string (function) |
sscanf | Read formatted data from string (function ) |
vfprintf | Write formatted variable argument list to stream (function) |
vprintf | Print formatted variable argument list to stdout (function) |
vsprintf | Print formatted variable argument list to string (function) |
fgetc | Get character from stream (function) |
fgets | Get string from stream (function ) |
fputc | Write character to stream (function) |
fputs | Write string to stream (function) |
getc | Get character from stream (function) |
getchar | Get character from stdin (function) |
gets | Get string from stdin (function ) |
putc | Write character to stream (function) |
putchar | Write character to stdout (function) |
puts | Write string to stdout (function) |
ungetc | Unget character from stream (function) |
fread | Read block of data from stream (function) |
fwrite | Write block of data to stream (function) |
fgetpos | Get current position in stream (function) |
fseek | Reposition stream position indicator (function) |
fsetpos | Set position indicator of stream (function) |
ftell | Get current position in stream (function) |
rewind | Set position indicator to the beginning (function) |
clearerr | Clear error indicators (function) |
feof | Check End-of-File indicator (function) |
ferror | Check error indicator (function) |
perror | Print error message (function) |
Macros
EOF | End-of-File (constant) |
FILENAME_MAX | Maximum length of file names (constant) |
NULL | Null pointer (constant) |
TMP_MAX | Number of temporary files (constant) |
_IOFBF,
_IOLBF,
_IONBF,
BUFSIZ,
FOPEN_MAX,
L_tmpnam,
SEEK_CUR,
SEEK_END and
SEEK_SET, each described with its corresponding function.
Types
FILE | Object containing information to control a stream (type ) |
fpos_t | Object containing information to specify a position within a file (type) |
size_t | Unsigned integral type (type) |
可以看到,在C中由于没有类的概念,顶多只有type,于是所有的方法都是纯方法,并没有类对象的依托,这是cstdio,与iostream.fstream.sstream之间的区别。
不过,cstdio仍然为我们提供了一些非常有用和底层的函数。
(1)前面介绍iostream时我们说再C IO中,只有对设备和文件的两种IO。是的。于是首先操作文件是cstdio的一个很大部分的功能,这里操作文件与使用流的方式读文件的数据无关。
包括删除、新建、重命名等等。
(2)格式化输入输出printf,scanf这样的函数则是我们常见的一种输入输入方法,格式一词体现了他们与纯输入输出(只是将数据都出来,以字节为单位)。
Printf,sanf这样这是一个特殊的专门用于给stdin和stdout输入输出。
Fprintf,fsanf这样的则是为一般的刘进行输入输出的。
Sprint,ssanf这样的这时面向字符串的输入输出(或许这里就是C++建立string流的灵感)。
还有vfprintf,vspintf,vprintf。这样的可以写一个列表的。
(3)除了上面对各种类型数据的格式化输入输出,还有针对字符串输入输出。
其中的函数基本与格式化输入输出对应。
(4)非格式化的,也就是直接写读的方法fread,fwrite。
这些方法其实都是针对文件的(文件包括设备),所以以stdio中以f开头的都是这一类,它们将文件看成一种流的格式( 不想C++那样需要特意声明出一个流对象)。
(5)与C++中一样,流是一种错觉,只是安排了某种特殊的指使位置来做到这一点,在C++中这种指示叫着,get pointer,在C中叫着position。
(6)与C++中流对象的三种状态(eof,bad,fail)以及状态操作对应,C中也有类似的方法来操作流的状态。
转载:刻卜浪兴的博客
相关文章推荐
- Java 与 c 及c++的比较
- Visual C++与Delphi/C++Builder之比较(一)
- C++与Java比较
- C和C++的面向对象实现机制比较
- 关于C#和C++的重载(Overload)、隐藏(Hide)、覆盖(Override)几个区别比较和得出的疑问
- C++中几种变量声明的比较
- [转载] C++和C#“事件”比较
- C++ 和 C# 语法的一些比较
- C++.NET与C#的编码区别 ,vb.net与c#的语法比较
- C++、Java/C#之比较
- C++中几个比较不常用的关键字(转)
- 在C/C++开发中容易被忽略却比较有用的两个函数
- Visual C++与Delphi/C++Builder之比较
- Java 与 c 及c++的比较
- C# 与 C 、 C++ 、 D 、 Java 的性能比较(二)
- JAVA 的interface观念 与C++ 多重继承的比较
- C++中几个比较不常用的关键字
- 比较C++和C#
- C++中引用与指针的比较
- [语法比较][指针/引用]Lava和C/C++语法比较