如何使用单个fstream创建、读取和写入文件

How to use a single fstream for creation, reading and writing a file

本文关键字:文件 读取 何使用 单个 fstream 创建      更新时间:2023-10-16

我想通过fstream访问具有以下要求的文件:

  • 如果文件不存在,它会创建
  • 可以读取文件(从位置0(
  • 文件可以(重写((从位置0(
  • 不关闭和重新打开文件

ios_base::in似乎禁用文件创建
ios_base::out似乎禁用文件读取

这可能吗?如何

#include <iostream>
#include <sstream>
#include <fstream>
#include <cassert>
using namespace std;
int main()
{
auto mode = ios_base::in|ios_base::out;
std::string filePath = "./test.txt";
std::string content1 = "Any content 1";
std::string content2 = "Any content 2";
{
std::remove(filePath.c_str());
}
{// Test creation
// make sure test.txt is missing / does not exists
fstream file(filePath, mode);
assert(file.is_open() && file.good());
file << content1;
}
{ // Test reading & writing
fstream file(filePath, mode);
// read
file.seekg(0);
std::stringstream buffer1;
buffer1 << file.rdbuf();
cout << buffer1.str() << endl;
assert(buffer1.str()==content1);
// write
file.seekp(0);
file << content2;
assert(file.is_open() && file.good());
// read
file.seekg(0);
std::stringstream buffer2;
buffer2 << file.rdbuf();
cout << buffer2.str() << endl;
assert(buffer2.str()==content2);
}
return 0;
}

运行

只有使用fstream,我才会说不。

您可能希望使用trunc模式,但如果文件存在,您将丢失所有内容(如果不使用trunc+out,这可能是个问题(

另一种方法是检查文件是否存在,如果不存在,则创建它(无论以何种方式(。然后你打开"输入和输出",然后做你的事情。

从cpp的角度读取刚刚创建的空文件是没有意义的