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 等
前者属于低级IO,后者是高级IO。
前者返回一个文件描述符(用户程序区的),后者返回一个文件指针。
前者无缓冲,后者有缓冲。
前者与 read, write 等配合使用, 后者与 fread, fwrite等配合使用。
后者是在前者的基础上扩充而来的,在大多数情况下,用后者。
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快。



int open(const char *path, int access,int mode)
    path要打开的文件路径和名称                           
    access访问模式,宏定义和含义如下:                       
       O_RDONLY        1   只读打开                        
       O_WRONLY        2   只写打开                        
       O_RDWR          4   读写打开                    
       还可选择以下模式与以上3种基本模式相与:                   
           O_CREAT     0x0100  创建一个文件并打开               
           O_TRUNC     0x0200  打开一个已存在的文件并将文件长度设置为0,其他属性保持        
           O_EXCL      0x0400  未使用                           
           O_APPEND    0x0800  追加打开文件                    
           O_TEXT      0x4000  打开文本文件翻译CR-LF控制字符     
           O_BINARY    0x8000  打开二进制字符,不作CR-LF翻译                                                       
    mode 该参数仅在access=O_CREAT方式下使用,其取值如下:      
       S_IFMT      0xF000  文件类型掩码                     
        S_IFDIR    0x4000  目录                             
        S_IFIFO    0x1000   FIFO专用                        
        S_IFCHR    0x2000  字符专用                         
        S_IFBLK    0x3000  块专用                           
        S_IFREG    0x8000  只为0x0000                       
        S_IREAD    0x0100  可读                             
        S_IWRITE   0x0080  可写                             
        S_IEXEC     0x0040   可执行
        
FILE *fopen(char *filename, char *mode)
    filename 文件名称
    mode打开模式:                                           
        r  只读方式打开一个文本文件                          
        rb 只读方式打开一个二进制文件                        
        w  只写方式打开一个文本文件                          
        wb 只写方式打开一个二进制文件                        
        a  追加方式打开一个文本文件                          
        ab 追加方式打开一个二进制文件                        
        r+ 可读可写方式打开一个文本文件                      
        rb+可读可写方式打开一个二进制文件                    
        w+ 可读可写方式创建一个文本文件                      
        wb+可读可写方式生成一个二进制文件                    
        a+ 可读可写追加方式打开一个文本文件                  
        ab+ 可读可写方式追加一个二进制文件
        
open和fopen的区别:
前者属于低级IO,后者是高级IO。
前者返回一个文件描述符,后者返回一个文件指针。
前者无缓冲,后者有缓冲。
前者与 read, write 等配合使用, 后者与 fread, fwrite等配合使用。
后者是在前者的基础上扩充而来的,在大多数情况下,用后者。    




fopen

编辑本段C语言

函数fopen

函数简介

函数功能:打开一个 文件
函数原型:FILE * f open(const char * path,const char * mode);
相关函数: openfclosefopen_s [1] ,_wfopen
所需库:< stdio.h>
返回值: 文件顺利打开后,指向该流的 文件指针就会被返回。如果 文件打开失败则返回NULL,并把 错误代码存在errno 中。
一般而言,打开 文件后会作一些文件读取或写入的动作,若打开文件失败,接下来的读写动作也无法顺利进行,所以一般在f open()后作错误判断及处理。
参数说明:
参数path 字符串包含欲打开的 文件路径及文件名,参数mode字符串则代表着流 形态
mode有下列几种形态字符串:
r 以 只读方式打开 文件,该文件必须存在。
r+ 以可读写方式打开 文件,该文件必须存在。
rb+ 读写打开一个 二进制文件,允许读 数据
rw+ 读写打开一个文本 文件,允许读和写。
w 打开只写 文件,若文件存在则文件长度清为0,即该文件内容会消失。若 文件不存在则建立该文件。
w+ 打开可读写 文件,若文件存在则文件长度清为零,即该文件内容会消失。若 文件不存在则建立该文件。
a 以附加的 方式打开只写 文件。若 文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
a+ 以附加方式打开可读写的 文件。若 文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
wb 只写打开或新建一个 二进制文件;只允许写数据。
wb+ 读写打开或建立一个 二进制文件,允许读和写。
ab+ 读写打开一个 二进制文件,允许读或在文件末追加数据。
at+ 打开一个叫string的文件,a表示append,就是说写入处理的时候是接着原来文件已有内容写入,不是从头写入覆盖掉,t表示打开文件的类型是文本文件,+号表示对文件既可以读也可以写。
上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库以二进制模式打开文件。如果不加b,表示默认加了t,即rt,wt,其中t表示以 文本模式打开文件。由f open()所建立的新 文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考umask 值。
有些C 编译系统可能不完全提供所有这些功能,有的C 版本不用"r+","w+","a+",而用"rw","wr","ar"等,读者注意所用系统的规定。
二进制和文本模式的区别
1.在windows系统中,文本模式下,文件以""代表换行。若以文本模式打开文件,并用fputs等函数写入换行符"\n"时,函数会自动在"\n"前面加上"\r"。即实际写入文件的是"" 。
2.在类Unix/Linux系统中文本模式下,文件以"\n"代表换行。所以Linux系统中在文本模式和二进制模式下并无区别。

程序示例

程序示例1
#include <stdio.h>
#include <stdlib.h> //为了使用exit()
int main()
{
char ch;
FILE* fp;
char fname[50]; //用于存放 文件
printf("输入文件名:");
scanf("%s",fname);
fp=f open(fname,"r"); //只供读取
if(fp==NULL) //如果失败了
{
printf("错误!");
exit(1); //中止程序
}
//getc()用于在打开 文件中获取一个字符
while((ch=getc(fp))!=EOF)
putchar(ch);
fclose(fp); //关闭 文件
return 0;
}
注意!初学者往往会犯一个错误,即在输入 文件名时不加后缀名,请注意加上!
程序示例2[2]
#include <stdio.h>
FILE *stream, *stream2;
int main( void )
{
int numclosed;
// Open for read (will fail if file "crt_fopen.c" does not exist)
if( (stream = fopen( "crt_fopen.c", "r" )) == NULL ) // C4996
// Note: f open is deprecated; consider using fopen_s instead
printf( "The file 'crt_f open.c' was not opened\n" );
else
printf( "The file 'crt_f open.c' was opened\n" );
// Open for write
if( (stream2 = fopen( "data2", "w+" )) == NULL ) // C4996
printf( "The file 'data2' was not opened\n" );
else
printf( "The file 'data2' was opened\n" );
// Close stream if it is not NULL
if( stream)
{
if ( fclose( stream ) )
{
printf( "The file 'crt_f open.c' was not closed\n" );
}
}
// All other files are closed:
numclosed = _ fcloseall( );
printf( "Number of files closed by _ fcloseall: %u\n", numclosed );
}
[3]

编辑本段操作

在文件操作时,需要注意以下几点问题
1、在定义文件指针时,要将文件指针指向空;如 FILE *fp = NULL;
2、文件操作完成后,需要将文件关闭,一定要注意,否则会造成文件所占用内存泄露和在下次访问文件时出现问题。
3、文件关闭后,需要将文件指针指向空,这样做会防止出现游离指针,而对整个工程造成不必要的麻烦;如:fp = NULL;
示例程序:
#include <stdio.h>
#define F_PATH "d:\myfile\file.dat"
int main(void)
{
FILE *fp = NULL; //需要注意
fp = fopen(F_PATH, "r");
if(NULL == fp)
{
return -1; //要返回错误代码
}
fclose(fp);
fp = NULL; //需要指向空,否则会指向原打开文件地址
return 0;
}

编辑本段程序

php程序-fopen
(PHP 3, PHP 4, PHP 5)
f open -- 打开 文件或者 URL
说明
resource f open ( string filename, string mode, [ bool use_include_path, [resource zcontext]] )
f open()将 filename 指定的名字资源绑定到一个流上。如果 filename 是 "scheme://..." 的格式,则被当成一个URL,PHP 将搜索协议处理器(也被称为封装协议)来处理此模式。如果该协议尚未注册封装协议,PHP 将发出一条消息来帮助检查 脚本中潜在的问题并将 filename 当成一个普通的 文件名继续执行下去。
如果 PHP 认为 filename 指定的是一个本地 文件,将尝试在该文件上打开一个流。该 文件必须是 PHP 可以访问的,因此需要确认文件访问权限允许该访问。如果激活了 安全模式 或者 open_basedir 则会应用进一步的限制。
例子
<?php
$handle = fopen("/home/rasmus/file.txt", "r");
$handle = fopen("/home/rasmus/file.gif", "wb");
?>

编辑本段函数

MATLAB函数fopen

函数功能

在matlab中,f open也是一个打开 文件的函数。在matlab的命令窗口中输入doc f open或者help fopen就可以获得该函数的帮助信息。

调用格式

fileID = f open( filename)
fileID = fopen( filename, permission)
fileID = fopen( filename, permission, machineformat)
fileID = fopen( filename, permission, machineformat, encoding)
[ fileID, message]= f open( filename, ...)
fIDs = f open('all')
[ filename, permission, machineformat, encoding]= fopen( fileID)
各种调用格式详情请参阅MATLAB帮助文档。

程序示例

% MATLAB: f open()函数的使用
clc
fileID = f open('Test.txt', 'w');
if fileID == -1
disp('f open failed.');
return;
else
disp('f open succeed.');
end
Str = 'It is just a test. By mayadong7349';
fprintf(fileID, '%s', Str);
% Caution:
disp('Now, I''d like to type the file.');
type('Test.txt');
fclose(fileID);
程序首先向 文件写入字符串,然后通过type打印在 屏幕上。
这里需要注意的是,如果字符串内有单撇号(')要用两个单撇号表示一个单撇号。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值