c和c++文件操作比较

来源:互联网 发布:装饰设计软件 编辑:程序博客网 时间:2024/05/08 15:29

我在这里比较下C语言和C++的文件操作。

首先是几个基础问题。

typedef basic_ifstream<char, char_traits<char> > ifstream;typedef basic_ofstream<char, char_traits<char> > ofstream;typedef basic_fstream<char, char_traits<char> >  fstream;
查了下stlport,stlport\stl\_iosfwd.h,发现fstream不过是个typedef。

char_traits是字符特性模板,目的是提供最基本的字符特性的统一的方法函数。
char_traits继承了__char_traits_base。

下面看代码,只列出了ascii的。

// char字符类型模板偏特化__STL_TEMPLATE_NULL class char_traits<char> : public __char_traits_base<char, int>{public:  //int类型到char类型的转换  static char_type to_char_type(const int_type& __c) { return static_cast<char_type>(static_cast<unsigned char>(__c)); } //char到int类型的转换  static int_type to_int_type(const char_type& __c) { return static_cast<unsigned char>(__c);}  //比较两个字符串  static int compare(const char* __s1, const char* __s2, size_t __n){ return memcmp(__s1, __s2, __n); }  //到字符的长度  static size_t length(const char* __s) { return strlen(__s); }  //字符赋值  static void assign(char& __c1, const char& __c2) { __c1 = __c2; }  //字串赋值  static char* assign(char* __s, size_t __n, char __c){ memset(__s, __c, __n); return __s; }};

在流的实现上,采取了缓冲区I/O的方式,每个stream对象中都有一个对于一个streambuf,对于流的操作缺省状态下是对于缓冲区的操作,直到出现迫使他和缓冲区同步的操作。read()使用了同步缓冲区,read()读取的时候,如果发现缓冲区中的数据不够,就试图从关联的数据源(这里就是文件)来读取。




fopen(打开文件) 
相关函数 open,fclose 
表头文件 #include<stdio.h> 
定义函数 FILE * fopen(const char * path,const char * mode); 
函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。
mode有下列几种形态字符串:
r 打开只读文件,该文件必须存在。
r+ 打开可读写的文件,该文件必须存在。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。不过在POSIX系统,包含Linux都会忽略该字符。由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考umask值。 
返回值 文件顺利打开后,指向该流的文件指针就会被返回。若果文件打开失败则返回NULL,并把错误代码存在errno 中。 
附加说明 一般而言,开文件后会作一些文件读取或写入的动作,若开文件失败,接下来的读写动作也无法顺利进行,所以在fopen()后请作错误判断及处理。 
范例
#include<stdio.h>
main()
{
FILE * fp;
fp=fopen(“noexist”,”a+”);
if(fp= =NULL) return;
fclose(fp);
}


feof(检查文件流是否读到了文件尾) 

相关函数 fopen,fgetc,fgets,fread 
表头文件 #include<stdio.h> 
定义函数 int feof(FILE * stream); 
函数说明 feof()用来侦测是否读取到了文件尾,尾数stream为fopen()所返回之文件指针。如果已到文件尾则返回非零值,其他情况返回0。 

返回值 返回非零值代表已到达文件尾。


fgetc(由文件中读取一个字符) 
相关函数 open,fread,fscanf,getc 
表头文件 include<stdio.h> 
定义函数 nt fgetc(FILE * stream); 
函数说明 fgetc()从参数stream所指的文件中读取一个字符。若读到文件尾而无数据时便返回EOF。 
返回值 getc()会返回读取到的字符,若返回EOF则表示到了文件尾。 
范例
#include<stdio.h>
main()
{
FILE *fp;
int c;
fp=fopen(“exist”,”r”);
while((c=fgetc(fp))!=EOF)
printf(“%c”,c);
fclose(fp);
}


fgets(由文件中读取一字符串) 
相关函数 open,fread,fscanf,getc 
表头文件 include<stdio.h> 
定义函数 har * fgets(char * s,int size,FILE * stream); 
函数说明 fgets()用来从参数stream所指的文件内读入字符并存到参数s所指的内存空间,直到出现换行字符、读到文件尾或是已读了size-1个字符为止,最后会加上NULL作为字符串结束。 
返回值 gets()若成功则返回s指针,返回NULL则表示有错误发生。 
范例 
#include<stdio.h>
main()
{
char s[80];
fputs(fgets(s,80,stdin),stdout);
}

执行 this is a test /*输入*/
this is a test /*输出*/



原创粉丝点击