㈠ linux 中 open和fopen的区别
在 C 语言中,open()、read()、write()、close() 函数是对一个二进制文件(或者文本文件)进行的低级操作函数;而fopen()、fread()、fwrite()、fclose() 函数是对一个二进制文件(或者文本文件)进行的高级操作函数。具体的函数参数如何写法,你可以参考 C 语言库函数的相关文档。通常情况下,如果要处理的数据比较大的话,低级操作肯定要比高级操作在速度上要快得多。
㈡ linux用什么标识,描述和控制文件
Linux的文件标识符,和Windows的就是文件名不同,它相当于文件的一个指针。在linux的C语言中,除了用通用的《【C】文件读写问题》(点击打开链)中介绍过的fopen等c语言通用操作文件以外,其Linux应用请参考《【Linux】利用C语言文件流复制单一文件),还能用文件标识符还来操作文件。这也是Linux中C语言,最底层,最原始控制文件的方式,其函数open,read,write,close已经完美地表明这一点。同时,在Linux无论是文件、设备和管道,甚至是个可操作对象对可以视作文件来对待,具体表现为都可以用这个文件标识符困岁春来操作他们。
文件标识符非常独特,并不是指针,其变量类型就是大家非常常用的int。
至于这个东西怎么用,具体请看如下文件读写程序:
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>//文件控制
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAXSIZE 512//缓冲区的大小
const char* FILEPATH="/tmp/file.txt";//文件目录
int main(void) {
int fd;//文件标识符,
char *s = "被折腾的文字";
char buffer[MAXSIZE+1];//用来接字符的缓冲区
int size;//读入的文件长度
if((fd=open(FILEPATH,O_CREAT|O_TRUNC|O_RDWR,0777))<0){
//O_CREAT如果指定文件不存在,则创建这个文件,O_EXCL如果要创建的文件已存在,则返回 -1,并且修改 errno 的值
//O_APPEND每次写操作都写入文件的末尾,O_TRUNC如果文件存在,并且以只写/读写方式打开,则清空文件全部内容
//O_RDONLY只读模式,O_WRONLY只写模式,O_RDWR读写模式
//0777为最高权限
perror("打开文件失败!");
exit(1);
}
if((write(fd,s,strlen(s)))<0){
perror("写入文件失败!");
exit(1);
}
//lseek(fd,0,SEEK_SET);//即把文件指针移至buf文件的开始处
lseek(fd,-strlen(s),SEEK_END);//即把文件指针往从结尾处向前移动strlen(s)个字符
if((size=read(fd,buffer,MAXSIZE))<0){
perror("读入文件失败!");
exit(1);
}else{
buffer[size]='\0';//字符串数组封口
printf("%s\n",buffer);
}
if(close(fd)<0) {
perror("关键文件失败!");
exit(1);
}
unlink(FILEPATH);//删除文件
exit(0);
}
这个程序的一大堆头文件,是没办法的,因为所用到的函数需要的基本头文件就是这么多,但这些头文件都是Linux的基本头文件,能够拿来直接用。
程序首先打开并同时利用open的参数创建一个文件,之后向这个文件,通过read函数写入一个名为“缓冲区”buffer的字符数组,也就是字符串string的一些东西,然后,写入完毕,因为文件操作光标将会移到文件最后,所以我们要先将其移回文件头,再利用write函数读入这个文件的内容到buffer,并打印到屏幕,最后再用close关闭文件标识符与文件的连接,并利用unlink删除这个文件,如果没有close,unlink将不起作用,因为这个程序正在占用这个/tmp/file.txt,无法删除,如果要强制删除可以考虑remove函数。
所以,上述代码的运行结果如下图:
最后雀橘,这个文件自然是要被删除的了,肯定是没有的:
上述程序很简单,但我们更多应该关注这里文件标识符汪耐的作用。fd这个int就是文件标识符,相当于FILE *的作用,但他就是一个int。实质上,这个int非常独特,同open函数,int fd里面存着要被操作文件的地址,但它却又不是int *,之后的write和read函数都要根据这个fd所指明的方向来,你可以发现write,read参数都有一个地方,填入了fd,可要求填入的,却是一个int变量,这在windows里面是没有的,同时不了解文件标识符的人,看到write和read的使用可能是云里雾里的,之后的close就更不用说了,就是清楚这个fd与被操作文件的关联关系。
unlink函数则和文件标识符无关,需要一个文件路径的参数。
㈢ linux下 对文件的 操作,用fopen fread,fwrite等,还是用open read,write哪个更好呢
上面几位都说到点子上了,fopen系的函数是C标准库的函数中操作文件流的函数(有缓冲)头文件stdio.h,open系的函数是posix规范的接口,没缓冲,头文件估计是io.h还是unistd.h我记不到了。返回值不一样(一个结构体指针一个int)然后就是open系的可以做更多的事,但fopen移植性好。这个看你的需求来用,顺便一提,win下mingw支持很多posix的函数(但至少fork,exec不支持,spawn倒是支持)
㈣ open和fopen的区别
open和fopen的区别:
1.缓冲文件系统
缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用,当执行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”, 装满后再从内存“缓冲区”依此读入接收的变量。执行写文件的操作时,先将数据写入内存“缓冲区”,待内存“缓冲区”装满后再写入文件。由此可以看出,内存 “缓冲区”的大小,影响着实际操作外存的次数,内存“缓冲区”越大,则操作外存的次数就少,执行速度就快、效率高。一般来说,文件“缓冲区”的大小随机器 而定。
fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind等
2.非缓冲文件系统
缓冲文件系统是借助文件结构体指针来对文件进行管理,通过文件指针来对文件进行访问,既可以读写字符、字符串、格式化数据,也可缓埋袭以读写二进制数 据。非缓冲文件系统依赖于操作系统,通过操作系统的功能对文件进行读写,是系统级的输入输出,它不设文件结构体指针,只能读写二进制文件,但效率高、速度 快,由于ANSI标准不再包括非缓冲文件系统,因此建议大家最好不要选择它。本书只作简单介绍。open, close, read, write, getc, getchar, putc, putchar 等。
open 是系统调用 返回的是文件句柄,文件的句柄是文件在文件描述副表里的索引,fopen是C的库函数,返回的是一个指向文件结构的指针。
fopen是ANSIC标准中的C语言库函数,在不同的系统中应该调用不同的内核api
linux中的系统函数是open,fopen是其封装函数,个人观点。仅供参考。
文件描述符是linux下的一个概念,linux下的一切设备都是以文件的形式操作.如网络套接字、硬件设备等。当然包括操作文件。
fopen是标准c函数。返回文件流而不是linux下文件句柄。
设备文件不可以当成流式文件来用,只能用open
fopen是用来操纵正规文件的,并且设有缓冲的,跟open还是有一些区别
一般用fopen打开普通文件,用open打开设备文件
fopen是标准c里的,而open是linux的系统调用.
他们的层次不同.
fopen可移植,open不能
我认为fopen和open最主要的区别是fopen在用户态下就有了缓扰兄存,在进行read和write的时候减少了用户态和内核态的切换,而open则每次都需要进行内核态和用户态的切换;表现为,如果顺序访问文件,fopen系列的函数要比直接调用open系列快;如果随机访问文件open要比fopen快。
来自论坛的经典回答:
前者属于低级IO,后者是高级IO。
前者返回一个文件描述符(用户程序区的),后者返回一液返个文件指针。
前者无缓冲,后者有缓冲。
前者与 read, write 等配合使用, 后者与 fread, fwrite等配合使用。
后者是在前者的基础上扩充而来的,在大多数情况下,用后者。
㈤ linux系统中,对普通文件的操作,关于对fopen和open的区别
这个是位或,不是与。位或、位与是这样计算的。 如:二进制的 010 001 结果是 011,而 010 & 001 结果就是0了。 O_WRONLY 和 O_CREAT 的关系就相当于上面的 010 和 001。他们位或的值不是0,位与的值就是0了。0表示什么都不做。用了位或后,就在一个整型的值上设置了不同的标志位,open函数会检测对应的标志位,如果该标志位设置为1了,就执行对应的操作。 O_CREAT的意思就是创建的意思,在这里就是将 创建文件 的标志位设置为1,这样open函数无法写这个文件的时候就会创建他。
㈥ linux 中 open和fopen的区别
Linux中open与fopen区别如下:
1、来源
从来源的角度看,两者能很好地区分开,这也是最显而易见的区别:
①open是Unix系统调用函数,返回的是文件描述符,它是文件在文件描述符表里的索引;
②fopen是ANSIC标准中的C语言库函数,在不同的系统中应该调用不同的内核api。返回的是一个指向文件结构的指针。
2、移植性
这一点从上面的来源可以推断出来,fopen是C标准函数,因此拥有良好的移植性,而open是Unix系统调用,移植性有限。如Windows下相似的功能使用API函数CreateFile。
3、适用范围
①open返回文件描述符,而文件描述符是Unix系统下的一个重要概念,Unix下的一切设备都是以文件的形式操作。如网络套接字、硬件设备等。当然包括操作普通正规文件。
②fopen是用来操纵普通正规文件。
4、文件IO层次
如果从文件IO的角度来看,前者属于低级IO函数,后者属于高级IO函数。低级和高级的简单区分标准是:谁离系统内核更近。低级文件IO运行在内核态,高级文件IO运行在用户态。
㈦ linux 中 open和fopen的区别
open 是系统调用 返回的是文件句柄,文件的句柄是文件在文件描述副表里的索引,fopen是C的库函数,返回的是一个指向文件结构的指针。
fopen是ANSIC标准中的C语言库函数,在不同的系统中应该调用不同的内核api
linux中的系统函数是open,fopen是其封装函数
open和fopen的区别:
1、open属于低级IO,fopen是高级IO。
2、open返回一个文件描述符,fopen返回一个文件指针。
3、open无缓冲,fopen有缓冲。
4、open与 read, write 等配合使用, fopen与 fread, fwrite等配合使用。
5、fopen是在open的基础上扩充而来的,在大多数情况下,用fopen。
㈧ linux open和fopen的区别
您好,请问您是想知道linux open和fopen的区别吗?
㈨ c语言 文件读入什么意思
文件读入就是将硬盘上的数据读到内存者铅中。我们开始写程序时,每次罩让程序启动时都是一样首闷好的;当我们把程序上次运行结果保存到文件中,下次启动时让程序读这个文件,就可以把程序上次执行的结果反映在你的程序钟了。
学到后来,我们会学到数据库。这是人家把各种文件的操作更加抽象化给你来用,这样可以处理大批的数据。
总之,文件是程序记忆性的基础。
㈩ linux中,使用fopen函数打开文件失败
你可以看下,在另一个目录的文件你是否有访问权限,同一个目录下一般来说,你把他复制过来,这个文件的拥有者(owner)就是你了,你是肯定可以访问的。每个程序都有一个当前目录的环境变量,你在shell中执行程序时,shell程序就是你执行的程序的父进程,你的程序从shell程序中继承了当前目录,所以你只给定文件名时,当然打开的就是当前目录下的文件了