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 /*输出*/
- c和c++文件操作比较
- c\c++文件操作比较
- C与C++简单文件操作比较
- c 和 文件 函数操作
- [C/C++]文件操作
- QFile和C语言对文件操作的性能比较.--读取double型二进制数据文件
- C比较文件相同
- C/C++文件操作效率比较——FILE/fstream
- C#--文件和目录操作小例子
- linux-c 文件操作读和写
- C和C++文件操作区别
- 文件和注册表操作(C#)
- Object-C文件和目录操作
- C标准库文件和文件夹操作
- C 和 C++ 文件操作详解
- C和C++中的字符串操作(比较详细)
- C/C++/Window 文件操作
- 【C/C++】C++文件操作
- IPSec基础-密钥交换和密钥保护Internet密钥交换(IKE)
- 深入理解java多态性(thinkGhoster)
- 线程,笔记
- ANDROID2.3改进
- Pthon WSGI心得
- c和c++文件操作比较
- REST资料汇总
- ThreadLocal
- 数据流图
- Java中各类Cache机制实现解决方案
- IP地址基本概念
- clone的小例子
- 常见乱码与下载图片
- android NDK 开发