一.效果
如下图所示,test.log是我正在写入的文件。
二.实现
#include <fstream>
#include <io.h>
#include <iostream>
#include <stdio.h>
class OfSteamImmediately : public std::ofstream
{
public:
OfSteamImmediately()
{
}
~OfSteamImmediately()
{
if (std::ofstream::is_open())
{
std::ofstream::close();
}
}
void open(const char *path, ios_base::openmode mode = ios_base::out)
{
// 访问protected变量_M_file
class MyFileBuf : public std::filebuf
{
public:
FILE *file()
{
return _M_file.file();
}
};
std::ofstream::open(path, mode);
auto fb = std::ofstream::rdbuf();
FILE *fp = ((MyFileBuf *)fb)->file();
m_fd = _fileno(fp);
}
int flush()
{
std::ofstream::flush();
return _commit(m_fd);
}
private:
int m_fd = 0;
};
int main(int argc, char *argv[])
{
OfSteamImmediately outStream;
std::string str;
// 弄个大点的草上爬
for (int i = 0; i < 100; i++)
{
str.append("CaoShangPa");
}
std::string filePath = "D:\\test.log";
std::cout << "Write file started: " << filePath <<std::endl;
std::ios_base::openmode mode = std::ios::app;
outStream.open(filePath.c_str(), mode);
if (outStream.fail())
{
std::cout << "File open failed: " << filePath <<std::endl;
return -1;
}
for (int i = 0; i < 100000; i++)
{
str = std::to_string(i) + str;
outStream.write(str.c_str(), str.size());
outStream.flush();
}
std::cout << "Write file finished: " << filePath <<std::endl;
return 0;
}