文件操作fopen,fopen_s,_fsopen

最近程序中打开文件时,失败了,最后代码问题在:

fopen_s(&pFile,strPath.c_str(),"rb+");

主要是"rb+"。

首先来看下介绍,主要是windows下的CRT相关的文件打开操作了。

C89标准中是 fopen:

FILE * fopen(const char *file, const char *mode);

windows中有fopen_s,_fsopen的扩展:

errno_t fopen_s(
   FILE** pFile,
   const char *filename,
   const char *mode
);

FILE *_fsopen(
   const char *filename,
   const char *mode,
   int shflag
);

通过看vs2008/2010下CRT的源码我们可以看到 fopen、fopen_s都是通过调用_fsopen来实现的:

FILE * fopen(const char *file, const char *mode)
{
    return( _fsopen(file, mode, _SH_DENYNO) );
}

errno_t fopen_s(FILE ** pfile, const char *file, const char *mode)
{
    _VALIDATE_RETURN_ERRCODE((pfile != NULL), EINVAL);
    *pfile = _fsopen(file, mode, _SH_SECURE);

    if(*pfile != NULL)
        return 0;
    return errno;
}

主要也就在于_fsopen的第3个参数了:int shflag:

#define _SH_DENYRW      0x10    /* deny read/write mode */
#define _SH_DENYWR      0x20    /* deny write mode */
#define _SH_DENYRD      0x30    /* deny read mode */
#define _SH_DENYNO      0x40    /* deny none mode */
#define _SH_SECURE      0x80    /* secure mode */

而通过源码中可看到,所谓的_SH_SECURE就是  /* share read access only if read-only */

所以区别就在于fopen是_SH_DENYNO即共享读写,而fopen_s是_SH_SECURE即在只读模式下才共享读,其他时不共享。

所以回到一开始的问题,之所以读文件失败,是因为几个进程同时在读这个文件,而模式用的是"rb+"即打开是为了读和写的,所以fopen_s会被一个进程锁住,不共享给其他进程。解决方案就是将"rb+"改成"rb"即只读模式,就可以了。

总结:打开文件时,能尽量减少读写标志就尽量减少,尤其是很多时候只需要只读就可以了,就不要加可写。

时间: 2024-11-02 13:33:47

文件操作fopen,fopen_s,_fsopen的相关文章

文件操作fopen

这块所谓的"文件操作"就是把文件的内容读进程序,然后根据具体的格式进行解析,或者是显示,或者是修改. 也就是把一个文件加载到程序里面,然后对其进行修改. 文件操作就三步(固定的三步): 1.打开文件. 2.操作文件 .(操作就是增删改 查) 3.关闭(保存)文件 原文地址:https://www.cnblogs.com/dabing0983/p/10610585.html

php文件加载和文件操作

文件加载: require和include两者的用法几乎完全一样:除了处理失败的方式不同.require在遇到错误时产生error,导致脚本中止:include只是产生警告,脚本会继续: require ‘vars.php’; require_once跟require的区别是会检查文件是否已经被包含过,如果是则不会再次被包含: include_once跟include的区别是会检查文件是否已经被包含过,如果是则不会再次被包含: 正则表达式: 正则表达式(regular expression)描述

Linux C 文件操作 -- 系统调用(open(),read()...) 和 标准I/O库(fopen(),fread()...)

一.什么是文件 在讲述文件操作之前,我们首先要知道什么是文件.看到这个问题你可能会感觉到可笑,因为对于用过计算机的人来说,文件是最简单不过的概念了,例如一个文本是一个文件,一个work文档是一个文件等.但是在Linux中,文件的概念还远不止于这些,在Linux中,一切(或几乎一切)都是文件.文件包括很多的内容,例如:大家知道的普通文件是文件,目录也是一个文件,设备也是一个文件,管道也是一个文件等等.对于目录.设备这些的操作也可以完全等同于对纯文本文件的操作,这也是Linux非常成功的特性之一吧.

Linux下C/C++的文件操作open、fopen与freopen

open是linux下的底层系统调用函数,fopen与freopen c/c++下的标准I/O库函数,带输入/输出缓冲.linxu下的fopen是open的封装函数,fopen最终还是要调用底层的系统调用open.所以在linux下如果需要对设备进行明确的控制,那最好使用底层系统调用(open), open对应的文件操作有:close, read, write,ioctl 等.fopen 对应的文件操作有:fclose, fread, fwrite, freopen, fseek, ftell,

Linux(C/C++)下的文件操作open、fopen与freopen

Linux(C/C++)下的文件操作open.fopen与freopen open是linux下的底层系统调用函数,fopen与freopen c/c++下的标准I/O库函数,带输入/输出缓冲. linxu下的fopen是open的封装函数,fopen终于还是要调用底层的系统调用open. 所以在linux下假设须要对设备进行明白的控制.那最好使用底层系统调用(open), open相应的文件操作有:close, read, write,ioctl 等. fopen 相应的文件操作有:fclos

C语言的fopen函数(文件操作/读写)

头文件:#include <stdio.h> fopen()是一个常用的函数,用来以指定的方式打开文件,其原型为:     FILE * fopen(const char * path, const char * mode); [参数]path为包含了路径的文件名,mode为文件打开方式. mode有以下几种方式: 打开方式 说明 r 以只读方式打开文件,该文件必须存在. r+ 以读/写方式打开文件,该文件必须存在. rb+ 以读/写方式打开一个二进制文件,只允许读/写数据. rt+ 以读/写

C/C++文件操作

1 基于C的文件操作 在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作 2 一.流式文件操作 3 4 1.fopen() 5 FILE *fopen(const char *filename,const char *mode) 6 "r" 以只读方式打开文件 7 "w" 以只写方式打开文件 8 "a" 以追加方式打开文件 9 "r+" 以读/写方式打开文件,如无文件出错 10 "w+&quo

C语言文件操作

文件操作 文件的打开 FILE * fopen(const char filename,const char * mode); 文件的打开操作 fopen 打开一个文件 (几种操作文件的组合) 文件的关闭操作 int fclose(FILE *fp); fclose 关闭一个文件 文件的读写操作 读取单个字符 fgetc 从文件中读取一个字符 int fgetc(FILE * fp); fputc 写一个字符到文件中去 int fput(int c,FILE * fp); 读取字符串 fgets

C 文件操作(一)

文件操作,包括文件的读和写.此篇讲讲非二进制文件的读写. #include <stdio.h> #include <stdlib.h> #define FILE_PATH "conf.txt" int main() {     system("color CE");     FILE * fp = NULL;     fp = fopen(FILE_PATH,"w");//w:以写的方式打开 , r: 以读的方式打开