首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ 文本文件同步讀寫實現:生產者-消費者模式演示

     編輯:C++ 入門

演示兩進程通過文本文件同步通信:寫進程每 2 秒追加一數字,讀進程每 5 秒讀取最新數字。使用 fstream + Sleep 模擬,Windows 平台。

寫進程(生產者)

// writer.cpp
#include <fstream>
#include <iostream>
#include <windows.h>

int main() {
    std::ofstream ofs("D:/w.txt", std::ios::app);  // 追加模式
    int num = 0;
    while (true) {
        ofs << ++num << std::endl;
        ofs.flush();  // 確保寫入磁盤
        std::cout << "Written: " << num << std::endl;
        Sleep(2000);
    }
    ofs.close();
    return 0;
}

讀進程(消費者)

// reader.cpp
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include <windows.h>

int main() {
    std::vector lines;
    while (true) {
        Sleep(5000);
        std::ifstream infile("D:/w.txt");
        if (!infile) { std::cerr << "Open failed\n"; return 1; }
        lines.clear();
        std::string line;
        while (std::getline(infile, line)) lines.push_back(line);
        infile.close();
        if (!lines.empty()) {
            std::cout << "Latest: " << lines.back() << std::endl;
        }
    }
    return 0;
}

關鍵點解析

技術點說明
std::ios::app追加模式打開,寫入自動定位文件末尾
ofs.flush()強制刷新緩衝區到磁盤,讀進程才能讀到最新數據
std::getline按行讀取,自動處理換行符
全路徑 D:/w.txt避免工作目錄不一致導致找不到文件
Sleep(ms)Windows API 線程休眠,模擬時間間隔

運行效果

寫進程控制台輸出:

Written: 1
Written: 2
Written: 3
...

讀進程控制台輸出(每 5 秒讀一次,讀到最新行):

Latest: 2
Latest: 4
Latest: 7
...

局限性與改進方向

  • 輪詢開銷大:讀進程每 5 秒讀整個文件,文件增大時效率低。改進:記錄上次讀取位置(tellg),增量讀取
  • 無鎖保護:多進程並發讀寫可能導致數據損壞。改進:文件鎖(LockFileEx)、命名管道、共享內存、Socket
  • 文件增長無限:長期運行磁盤佔用增大。改進:循環日誌、定期截斷
  • 跨平台:Sleep/windows.h 僅 Windows。跨平台用 std::this_thread::sleep_for (C++11)

生產級替代方案

  1. 命名管道:CreateNamedPipe (Win) / mkfifo (Linux),內核緩衝、阻塞同步
  2. 本地 Socket:AF_UNIX / AF_LOCAL,雙向通信、標準化
  3. 共享內存 + 信號量/互斥體:最高性能,適合高頻大數據交換
  4. 消息隊列:Boost.Interprocess::message_queue、ZeroMQ、RabbitMQ

文件同步適合簡單、低頻、跨語言場景;高併發、低延遲、雙向通信請使用專用 IPC 機制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved