头文件:#include<fstream>
写文件对象:ofstream
读文件对象:ifstream
读写对象:fstream
分清楚两个 <<
表示写入 >>
表示读取
#include <iostream>
#include <fstream>void writeFile()
{std::ofstream file;file.open("1.txt", std::ios::app);// std::ofstream file("1.txt", std::ios::app) 上面两行代替if (file.is_open()){file << "你好世界" << std::endl;}file.close();
}
void readFile()
{std::ifstream file;file.open("1.txt");// std::ifstream file("1.txt"); 上面liangstd::string _str;if (file.is_open()){while (getline(file, _str)) // 读取一行{std::cout << _str << std::endl;}}
}void readWriteFile()
{std::fstream file;file.open("mytext.text", std::ios::app);if (file.is_open()){file << "笑鼠啦" << std::endl; // 写文件file << "祝我通过金山面试" << std::endl; // 写文件file.close();// 读文件file.open("mytext.text");std::string str;while (getline(file, str)){std::cout << str << std::endl;}}file.close();
}
int main()
{readWriteFile();return 0;
}
对于权限如下:
案例(日志文件滚动落盘,限制1G):
#include <iostream>
#include <fstream>
#include <string>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <atomic>
#include <filesystem>class AsyncLogger
{
public:AsyncLogger(const std::string &baseFileName) : baseFileName_(baseFileName), currentFileNamber_(0), stop_(false){openNameFile(); // 创建文件writeThread_ = std::thread(&AsyncLogger::writeLoop, this); // 开启异步日志线程}~AsyncLogger(){{std::unique_lock<std::mutex> lock(mutex_);stop_ = true;}cv_.notify_one();if (writeThread_.joinable()){writeThread_.join();}}// 写日志接口void log(const std::string &message){std::unique_lock<std::mutex> lock(mutex_);logQueue_.push(message);cv_.notify_one();}private:// 日志线程void writeLoop(){std::queue<std::string> localQueue;while (true){{std::unique_lock<std::mutex> lock(mutex_);cv_.wait(lock, [this](){ return stop_ || !logQueue_.empty(); }); // 条件变量日志队列不为空// 关闭if (stop_ && logQueue_.empty()){break;}// 交换到临时队列localQueue.swap(logQueue_);}// 写入到文件while (!localQueue.empty()){const std::string &message = localQueue.front();logFile_ << message << std::endl;// 超出一个G,创建新文件if (logFile_.tellp() > 1LL * 1024 * 1024 * 1024){ // 文件字节为单位logFile_.close();openNameFile();}localQueue.pop();}// 刷新缓存logFile_.flush();}}// 打开文件void openNameFile(){std::string fileName = baseFileName_ + std::to_string(currentFileNamber_++) + ".log";logFile_.open(fileName, std::ios::app);if (!logFile_.is_open()){std::cerr << "文件打开失败" << std::endl;}};std::string baseFileName_;int currentFileNamber_;std::ofstream logFile_; // 文件写入对象std::queue<std::string> logQueue_; // 日志队列std::mutex mutex_;std::condition_variable cv_;std::thread writeThread_; // 日志线程std::atomic<bool> stop_;
};int main()
{AsyncLogger logger("mylog");logger.log("这是一个异步日志系统");logger.log("写入第二个文件");
}