一般的系统中是怎样实现php fopen函数数的

FOpen函数_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩4页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢详解C语言中的fopen()函数和fdopen()函数
转载 & & 投稿:goldensun
这篇文章主要介绍了详解C语言中的fopen()函数和fdopen()函数,注意其之间指针功能相关的区别,需要的朋友可以参考下
C语言fopen()函数:打开一个文件并返回文件指针
#include &stdio.h&
fopen()是一个常用的函数,用来以指定的方式打开文件,其原型为:
FILE * fopen(const char * path, const char * mode);
【参数】path为包含了路径的文件名,mode为文件打开方式。
mode有以下几种方式:
在POSIX 系统,包含Linux 下都会忽略 b 字符。由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考umask 值。
二进制和文本模式的区别:
在windows系统中,文本模式下,文件以"\r\n"代表换行。若以文本模式打开文件,并用fputs等函数写入换行符"\n"时,函数会自动在"\n"前面加上"\r"。即实际写入文件的是"\r\n" 。
在类Unix/Linux系统中文本模式下,文件以"\n"代表换行。所以Linux系统中在文本模式和二进制模式下并无区别。
更多信息请查看:C语言fopen()打开文本文件与二进制文件的区别
有些C编译系统可能不完全提供所有这些功能,有的C版本不用"r+","w+","a+",而用"rw","wr","ar"等,读者注意所用系统的规定。
【返回值】文件顺利打开后,指向该流的文件指针就会被返回。若果文件打开失败则返回NULL,并把错误代码存在errno 中。
注意:一般而言,开文件后会作一些文件读取或写入的动作,若开文件失败,接下来的读写动作也无法顺利进行,所以在fopen()后请作错误判断及处理。
文件操作完成后,需要将文件关闭,一定要注意,否则会造成文件所占用内存泄露和在下次访问文件时出现问题。
文件关闭后,需要将文件指针指向空,这样做会防止出现游离指针,而对整个工程造成不必要的麻烦,如fp = NULL。
【实例】打开一个文件然后关闭该文件。
#include&stdio.h&
#include&string.h&
#include&stdlib.h&
int main()
char msg[100] = "Hello!I have read this file.";
fstream=fopen("test.txt","at+");
if(fstream==NULL)
printf("open file test.txt failed!\n");
printf("open file test.txt succeed!\n");
fclose(fstream);
C语言fdopen()函数:将文件描述词转为文件指针
#include &stdio.h&
定义函数:
FILE * fdopen(int fildes, const char * mode);
函数说明:fdopen()会将参数fildes 的文件描述词, 转换为对应的文件指针后返回.
参数mode 字符串则代表着文件指针的流形态, 此形态必须和原先文件描述词读写模式相同. 关于mode 字符串格式请参考fopen().
返回值:转换成功时返回指向该流的文件指针. 失败则返回NULL, 并把错误代码存在errno 中.
#include &stdio.h&
FILE * fp = fdopen(0, "w+");
fprintf(fp, "%s\n", "hello!");
fclose(fp);
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具求助QT如何使用fopen函数_百度知道
求助QT如何使用fopen函数
我有更好的答案
通过调用操作系统提供的底层API实现。例如在Windows中,fopen是通过API函数CreateFile实现的。
采纳率:63%
来自团队:
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。365被浏览16,083分享邀请回答uint16_t *vga_mem = 0xb800;
vga_mem[0][0] = 'A' | ((0 && 4)| 4 )&&8;
这两句就能在屏幕的第一行第一列输出一个黑底红字的字母 ‘A’,更多的资料还请参考 在此基础上, 处理一下光标位置和特殊字符,就可以实现一个 getchar 了: 。接着也可以很容易地实现 puts:对一个字符串的每个元素都 putchar 一次就好了。现在我们可以自由地打印字符串了,但只是在内核中,用户程序对内存地址 0xb800 是没有读写权限的。所以我们要实现一个系统调用 sys_write,让用户传递一个字符串给内核,由内核再打印出来。 为什么不是叫 sys_puts 呢?因为 sys_wirte 不止可以往屏幕写入,往文件,往管道写入都是可以的,往屏幕写字串,在这个内核里被实现为往设备 con 里写入字串,当然在这里这不是重点,所以我们还是把它叫做 sys_puts 好了。从内核的角度看,sys_puts 是个没有参数也没有返回值的函数,因为内核和用户程序并不能简单地通过 C 语言的调用约定来传递参数:它们不能共用一个栈。所以 sys_puts 是这样做的:它直接读取用户进程的用户用户栈,从上面取出参数,这里至少得有两个参数:字串指针地址 和 字符串长度。 检查 字串地址 + 字串长度 是否还在该进程的空间内,这是必要的安全检查。检查完后就可以把字符串交给 puts 了,再在该进程的中断上下文中的 eax 中保存返回值。然后从系统调用返回。(在执行 int 0x80 和离开系统调用的时候内核做了很多工作,此处就不展开了,建议参考 xv6)在用户程序看来,调用系统调用其实和调用普通函数并无二致,我们可以生成 C 函数到系统调用的接口:global puts
mov eax, SYS_PUTS ; 系统调用号
而在 C 的头文件的加入这样的声明:int puts(char *addr, uint32_t n);
只要引用这个头文件并链接入上面那段汇编代码,就可以在用户程序像使用普通函数一样使用 puts 了。如何实现 printf 呢?首先要处理的是对不定长参数的处理:C 语言有语法来实现这个:void printk(const char *fmt, ...);
在 printf 和 puts 之间,我加了个函数
sprintf 作为中间层,而 printf 只是负责把 sprintf 的输入传递给 puts 而已。来说说 sprintf。C 的默认调用约定是从右到左压入参数,并由调用者清除堆栈,所以被调用者并不知道它有多少个参数要处理。 对于被调用者 printf,它唯一能确定的是第一个参数肯定是字符串指针,而这个参数的地址在往上就是可能存在的第二个参数(x86 栈从高地址向低地址增长),printf 把字符串地址和第二个参数的地址传给 了 sprintf (第二个参数地址用宏 va_start 生成)。sprintf 只管在字符串中寻找控制字符串(%s %d %x 等),遇到一个 %d 则从栈里取出一个整数,遇到 %s 则取出一个字串指针,然后把指针往上移动一个 sizeof (用宏 va_arg,这里和普通 sizeof 的不同在于要考虑栈的地址对齐),对于取出来的参数,把它转换成字符串(用整数用 itoa,浮点数用 gcvt,想办法插入原字符串就好了。和参数相关的三个宏如下:#define va_start(ap, v)
(ap = (va_list)&v + _INTSIZEOF(v))
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_end(ap) (ap = (char*) 0)
sprinf 类似的实现: printf 实现12713 条评论分享收藏感谢收起14添加评论分享收藏感谢收起C语言中的fopen()函数打开文件时,文件名有什么限制吗?_百度知道
C语言中的fopen()函数打开文件时,文件名有什么限制吗?
C语言中的fopen()函数打开文件时,文件名有什么限制吗?为什么当我的文件名包含点或者下划线时,打开操作总是失败的?万分感激。
我有更好的答案
文件主名和扩展名可以使用的字符是:英文字母:A—z(大小写等价)数&字:0—9汉&字特殊符号:$#&@()-[]^~等。各种控制字符和下列字符不能用在文件名中:&&&&/&\&|&:&&&*&?&&&&&//这些字符已做它用文件名字母大小写的区分:DOS下文件名不区分大小写。在Windows系统下,显示区分大小写,读写操作时不区分。在类Unix/Linux系统下,区分字母大小写。文件名长度的限制:DOS下文件名长度应为 8.3 即8位文件名3位扩展名。在Windows系统下,可以多个扩展名,以最后一个为准,文件名长度255。在类Unix/Linux系统下,文件名长度255,带路径的长度1024,也有系统4096。文件名可以直接写进去函数里,也可以放在变量里:FILE&*&char&namein[]=&abc.txt&;fp=fopen(namein,&r&);或&fp=fopen(&abc.txt&,&r&);文件名若带路径,单反斜杠要写成双反斜杠,例如:char&namein[]=&C:\\path\\abc.txt&;
\temp&#92。如.dat&,故目录要用两个&#92, &r&quot, &w&由于\为转义操作符;FILE *fout = fopen(&C:\),含:FILE *fin = fopen(&quot文件名必须是一个C字符串;data_;\o_data,它是符合操作系统标准的合法文件.dat&.和下划线不会错;)
本回答被提问者和网友采纳
限制~相同目录下的文件即可不带后缀xxfopen(&xx&,fp);text.txt&带的text.txtfopen(&quot
没有把,不过转义字符应该不能用
文件名没有限制,含点和下划线也没有问题,用引号引起来即可,路径中的“\”要写成&\\&或者“/”
其他2条回答
为您推荐:
其他类似问题
fopen的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 fopen函数 的文章

 

随机推荐