在C+中调用C函数时,是否可以将std::vector作为文件*偷偷引入+;11?
调用预期接收文件指针的C函数时,如何使用在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
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级内存映射;事实上,这使您能够“直接”(至少从代码的角度)访问该文件。有许多不同的模式可以实现这一点,但基本上它只是将文件用作虚拟内存的一部分。因此,如果您对文件进行更改,实际上您正在更改磁盘上的文件,也就是说,在您关闭文件或命令它关闭之前,不会写入对文件的更改;但是应该有即时模式,在您更改内存时或多或少地保持数据同步
不确定写操作是否是用例的一个特定部分,但是使用映射可能仍然是有利的,或者不是,即使您不做任何写操作。最好的方法是使用一些非常接近的数据文件进行原型设计