当我实现 DBMS 的磁盘管理组件时,是否可以在 C++ 中使用 fstream 来读取或写入文件
Can I use fstream in C++ to read or write file when I'm implementing a disk management component of DBMS
在C++中,我知道我可以使用读取或写入系统功能(如读取或写入)来读取或写入文件,也可以在fstream的帮助下做到这一点。
现在我正在实现一个磁盘管理,它是DBMS的一个组件。为简单起见,我只使用磁盘管理来管理 Unix 文件的空间。
我所知道的是 fstream 包装系统功能,如读取或写入并提供一些缓冲区。但是我想知道这是否会影响原子性和同步性?
我的问题是我应该使用哪种方式,为什么?
No.特别是不是Unix。DBM 将需要连续的文件。这意味着要么是支持它们的 unix 变体,要么是创建磁盘分区。
您还需要处理缓冲;而不是遵循C++库的缓冲。
我可以继续说下去,但流是针对数据流的,而不是安全可靠的结构化数据。
以下有关"fstream"的同步和线程安全的信息可以从ISO C++标准中找到。
27.2.3 线程安全 [iostreams.threadsafety]
并发访问流对象(27.8、27.9)、流缓冲区 对象 (27.6) 或 C 库流 (27.9.2) 可能由多个线程 除非另有说明,否则会导致数据争用 (1.10) (27.4)。[ 注意:数据争用会导致未定义的行为 (1.10)。—尾注 ]
如果一个线程使库调用将值写入流 结果,另一个线程从流中读取此值 通过库调用 b,这样这不会导致数据 比赛,然后 A 的写入与 B 的读取同步。
默认情况下,C/C++文件 I/O 操作不是线程安全的。因此,如果您计划使用打开/写入/读取系统调用的 fstream,那么您必须在实现中自己使用同步机制。您可以使用新C++标准(.i.e C++11)中提供的"std::mutex"机制来同步文件I/O。
- 在fstream期间忽略空行
- 使用fstream对txt文件中的数字进行循环
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 无法打开 fstream C++文件,即使它与 .cpp 位于同一位置
- 使 std::fstream 写入文件末尾,但从头开始读取
- 为什么当我在 std::string 中打开文件名的 fstream 时出现"no matching function"错误?
- 自定义 std::fstream,std::filebuf 的溢出和下溢函数未为每个字符调用
- 如何修复函数中的 fstream 文件输入以将正确的信息存储在结构数组中?
- fstream / ifstream / ofstream 对象如何转换为布尔值
- 使用命令的未定义引用<fstream>
- 如何检查文件是否已存在于 fstream C++中
- 如何正确使用 fstream 并在 char 数组中传递数据?
- 如何使用 fstream 的 .get 字符串?
- 使用 fstream 库并在屏幕上打印的文件有问题?
- Windows std::fstream 修改文件后打开()?
- 如何删除文件中的数字,通过 c++ fstream 的
- std::fstream 在 MSVC 和 G++ 上使用 UTF-8 的不同行为
- C++ 错误检查 fstream open() 命令和一般字符串流错误处理
- 在istream_iterator中使用后的 C++ FSTREAM obj 回滚
- 如何使用单个fstream创建、读取和写入文件