Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C+中调用C函数时,是否可以将std::vector作为文件*偷偷引入+;11?_C_File_C++11_File Io_Vector - Fatal编程技术网

在C+中调用C函数时,是否可以将std::vector作为文件*偷偷引入+;11?

在C+中调用C函数时,是否可以将std::vector作为文件*偷偷引入+;11?,c,file,c++11,file-io,vector,C,File,C++11,File Io,Vector,调用预期接收文件指针的C函数时,如何使用std::vector或std::vector作为FILE*参数 就我个人而言,我无法从标准库中回忆起任何可以用作C样式文件的对象或元素 我为什么要这样做: 尽快获得用户空间,因此我快速将所有内容加载到向量中 “集中化”内存管理,因为我经常使用向量,所以我只使用另一个向量来处理文件 简化了算法和函数,原因与我前面的观点基本相同 绝对不是-像fprintf这样的函数期望能够取消对文件的引用*并获得一个文件,而std::vector绝对不是文件。在glibc

调用预期接收文件指针的C函数时,如何使用
std::vector
std::vector
作为
FILE*
参数

就我个人而言,我无法从标准库中回忆起任何可以用作C样式文件的对象或元素

我为什么要这样做:

  • 尽快获得用户空间,因此我快速将所有内容加载到向量中
  • “集中化”内存管理,因为我经常使用向量,所以我只使用另一个向量来处理文件
  • 简化了算法和函数,原因与我前面的观点基本相同

绝对不是-像
fprintf
这样的函数期望能够取消对
文件的引用*
并获得一个
文件
,而
std::vector
绝对不是
文件
。在glibc中,
文件
是这样的类型定义:

struct _IO_FILE {
  int _flags;           /* High-order word is _IO_MAGIC; rest is flags. */
#define _IO_file_flags _flags

  /* The following pointers correspond to the C++ streambuf protocol. */
  /* Note:  Tk uses the _IO_read_ptr and _IO_read_end fields directly. */
  char* _IO_read_ptr;   /* Current read pointer */
  char* _IO_read_end;   /* End of get area. */
  char* _IO_read_base;  /* Start of putback+get area. */
  char* _IO_write_base; /* Start of put area. */
  char* _IO_write_ptr;  /* Current put pointer. */
  char* _IO_write_end;  /* End of put area. */
  char* _IO_buf_base;   /* Start of reserve area. */
  char* _IO_buf_end;    /* End of reserve area. */
  /* The following fields are used to support backing up and undo. */
  char *_IO_save_base; /* Pointer to start of non-current get area. */
  char *_IO_backup_base;  /* Pointer to first valid character of backup area */
  char *_IO_save_end; /* Pointer to end of non-current get area. */

  struct _IO_marker *_markers;

  struct _IO_FILE *_chain;

  int _fileno;
#if 0
  int _blksize;
#else
  int _flags2;
#endif
  _IO_off_t _old_offset; /* This used to be _offset but it's too small.  */

#define __HAVE_COLUMN /* temporary */
  /* 1+column number of pbase(); 0 is unknown. */
  unsigned short _cur_column;
  signed char _vtable_offset;
  char _shortbuf[1];

  /*  char* _save_gptr;  char* _save_egptr; */

  _IO_lock_t *_lock;
#ifdef _IO_USE_OLD_IO_FILE
};

绝对不是-像
fprintf
这样的函数期望能够取消引用
文件*
并获得
文件
,而
std::vector
绝对不是
文件
。在glibc中,
文件
是这样的类型定义:

struct _IO_FILE {
  int _flags;           /* High-order word is _IO_MAGIC; rest is flags. */
#define _IO_file_flags _flags

  /* The following pointers correspond to the C++ streambuf protocol. */
  /* Note:  Tk uses the _IO_read_ptr and _IO_read_end fields directly. */
  char* _IO_read_ptr;   /* Current read pointer */
  char* _IO_read_end;   /* End of get area. */
  char* _IO_read_base;  /* Start of putback+get area. */
  char* _IO_write_base; /* Start of put area. */
  char* _IO_write_ptr;  /* Current put pointer. */
  char* _IO_write_end;  /* End of put area. */
  char* _IO_buf_base;   /* Start of reserve area. */
  char* _IO_buf_end;    /* End of reserve area. */
  /* The following fields are used to support backing up and undo. */
  char *_IO_save_base; /* Pointer to start of non-current get area. */
  char *_IO_backup_base;  /* Pointer to first valid character of backup area */
  char *_IO_save_end; /* Pointer to end of non-current get area. */

  struct _IO_marker *_markers;

  struct _IO_FILE *_chain;

  int _fileno;
#if 0
  int _blksize;
#else
  int _flags2;
#endif
  _IO_off_t _old_offset; /* This used to be _offset but it's too small.  */

#define __HAVE_COLUMN /* temporary */
  /* 1+column number of pbase(); 0 is unknown. */
  unsigned short _cur_column;
  signed char _vtable_offset;
  char _shortbuf[1];

  /*  char* _save_gptr;  char* _save_egptr; */

  _IO_lock_t *_lock;
#ifdef _IO_USE_OLD_IO_FILE
};

FILE*
std::vector*
是两种不同的类型,它们不能直接兼容

一个简单的例子是
std::vector
将对象使用的所有数据存储在内存中。另一方面,
文件*
有一个不透明的整数,允许函数从操作系统请求更多数据

因此,如果你要这样做:

std::string get_line(FILE *) { ... }
你称之为:

std::vector<char> v
std::string s = get_line((FILE *) &v);
std::vector v std::string s=get_行((文件*)&v);
我希望您的应用程序表现出大量未定义的行为。

文件*和
std::vector*
是两种不同的类型,不能直接兼容

一个简单的例子是
std::vector
将对象使用的所有数据存储在内存中。另一方面,
文件*
有一个不透明的整数,允许函数从操作系统请求更多数据

因此,如果你要这样做:

std::string get_line(FILE *) { ... }
你称之为:

std::vector<char> v
std::string s = get_line((FILE *) &v);
std::vector v std::string s=get_行((文件*)&v);
我希望您的应用程序显示大量未定义的行为。

在某些平台上,标准库包含可用于此目的的函数。例如,在Linux上,以下两个功能可用:

  • :从字符缓冲区创建一个
    文件*
  • :使用自定义函数创建一个
    文件*

根据链接的手册页,fmemopen是POSIX-2008的一部分,fopencookie是GNU扩展。

在某些平台上,标准库包含可用于此目的的函数。例如,在Linux上,以下两个功能可用:

  • :从字符缓冲区创建一个
    文件*
  • :使用自定义函数创建一个
    文件*

根据链接的手册页,fmemopen是POSIX-2008的一部分,fopencookie是GNU扩展。

在非常有限的意义上,您只能使用函数*进行阅读

  • 实例化一个
    向量
  • 根据需要用数据填充向量
  • 调用
    fmemopen
    ,传递它
    vect.data()
    vect.size()
    ,以及
    “r”
    标志
  • 使用生成的
    文件*
    传递给需要读取文件的函数

*但这并不意味着这样做是值得的。

在非常有限的意义上,您可以使用函数*进行阅读

  • 实例化一个
    向量
  • 根据需要用数据填充向量
  • 调用
    fmemopen
    ,传递它
    vect.data()
    vect.size()
    ,以及
    “r”
    标志
  • 使用生成的
    文件*
    传递给需要读取文件的函数

*但这并不意味着这样做是值得的。

好吧,从你的描述来看,似乎你想要一些可以作为内存块或(C风格)文件流访问的东西;如果是这样的话,与多次往返于向量类型相比,您最好使用内存映射的文件与共享模式
文件*
并行使用

我已经有一段时间了,但是看起来好像有一个SooCoFrand被称为“代码> FMSTRORMON/COMPUTE”,它给了你一个C++包装(最新的源码似乎包含C++ 11个特性;我要检查一下,以确保发布的版本也做得好)被称为<代码> FMSTRORMON/COD>。(对于只读版本,

ifmstream

要使用内存映射文件,您将通过使用前面提到的类打开它来进行实例化。这(我假设)将是文件的OS级内存映射;事实上,这使您能够“直接”(至少从代码的角度)访问该文件。有许多不同的模式可以实现这一点,但基本上它只是将文件用作虚拟内存的一部分。因此,如果您对文件进行更改,实际上您正在更改磁盘上的文件,也就是说,在您关闭文件或命令它关闭之前,不会写入对文件的更改;但是应该有即时模式,在您更改内存时或多或少地保持数据同步

不确定写操作是否是用例的一个特定部分,但是使用映射可能仍然是有利的,或者不是,即使您不做任何写操作。最好的方法是使用一些非常接近的数据文件进行原型设计