如何使用std::ifstream 和 std::ofstream 一个线程写入数据,另外一个线程读取数据,实例说明
时间: 2024-10-27 10:06:53 浏览: 40
dat.rar_数据流
在 C++ 中,`std::ifstream` 和 `std::ofstream` 分别用于读取(Input File Stream)和写入(Output File Stream)文件。为了实现在两个线程之间进行数据的读写操作,你需要确保同步和互斥,避免数据混乱。这里我们使用 `std::mutex` 来提供线程安全。
首先,定义一个包含文件句柄、读写标志以及互斥锁的结构体:
```cpp
#include <fstream>
#include <thread>
#include <mutex>
struct DataIO {
std::ifstream in;
std::ofstream out;
bool isWriting; // 标记当前是否为写入模式
std::mutex mtx; // 互斥锁
};
```
然后创建一个线程写入数据的方法:
```cpp
void writeThread(DataIO& io) {
io.isWriting = true; // 设置为写入模式
for (int i = 0; i < 100; ++i) { // 假设要写入100个整数
int data;
if (io.out) {
io.mtx.lock();
io.out << i << "\n";
io.mtx.unlock();
}
}
io.isWriting = false; // 设置回读取模式
}
```
同样,创建一个线程读取数据的方法:
```cpp
void readThread(DataIO& io) {
while (true) {
io.mtx.lock();
if (!io.in || !io.isWriting) {
io.mtx.unlock();
if (!io.in) break; // 文件已关闭或写入结束,退出循环
int data;
io.in >> data; // 读取数据
io.mtx.unlock();
// 打印或处理读取到的数据
std::cout << "Read: " << data << std::endl;
} else {
io.mtx.unlock(); // 正在写入,等待
}
}
}
```
最后,在主函数中创建并启动这两个线程:
```cpp
int main() {
DataIO io;
io.in.open("data.txt", std::ios::in);
io.out.open("data.txt", std::ios::out | std::ios::app); // 追加模式
std::thread writer(writeThread, std::ref(io));
std::thread reader(readThread, std::ref(io));
writer.join();
reader.join();
return 0;
}
```
阅读全文