【问题标题】:C++ windows.h WriteFile functionC++ windows.h 写入文件函数
【发布时间】:2019-01-13 06:29:47
【问题描述】:

我试图在控制台中显示正在运行的进程列表和当前时间,并使用 WriteFile 和 windows.h 函数将它们保存到文本文件中。如何在不使用 C++ 中的“freopen”的情况下有效地将输出流和“我的数据...”重定向到文本文件?

#include <windows.h>
#include <tlhelp32.h>
#include <iostream>
#include <chrono>

using namespace std;

int main()
{
    char temp;
      HANDLE h = CreateFile("process.txt",  // name of the file
                          GENERIC_WRITE,    // open for writing
                          0,                // sharing mode, none in this case
                          0,                // use default security descriptor
                          CREATE_ALWAYS,    // overwrite if exists
                          FILE_ATTRIBUTE_NORMAL,
                          0);

     if (h)
    {
        std::cout << "CreateFile() succeeded\n";
        CloseHandle(h);
    }
    else
    {
        std::cerr << "CreateFile() failed:" << GetLastError() << "\n";
    }

    time_t actualTime = chrono::system_clock::to_time_t(chrono::system_clock::now());
    cout << ctime(&actualTime);
    cout << "My data..." << endl;

    PROCESSENTRY32 proc32;
    HANDLE hSnapshot;

    hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    proc32.dwSize = sizeof(PROCESSENTRY32);

   if(Process32First(hSnapshot, &proc32))
   {
        cout << proc32.szExeFile << endl;
        while(Process32Next(hSnapshot, &proc32))
        cout << proc32.szExeFile << endl;
   }

   WriteFile(HANDLE hFile,
            LPCVOID lpBuffer,
            DWORD nNumberOfBytesToWrite,
            LPDWORD lpNumberOfBytesWritten,
            LPOVERLAPPED lpOverlapped
            );

    CloseHandle(hSnapshot);

    system ("pause >nul");

    return 0;
}

【问题讨论】:

标签: c++ winapi writefile


【解决方案1】:

使用 OPEN_ALWAYS 而不是 CREATE_ALWAYS,然后使用 SetFilePointer 将文件指针移动到文件末尾。

【讨论】:

  • SetFilePointer 不存在使用意义。需要在OVERLAPPED中使用显式偏移量
  • 你不需要异步操作。
  • 这里的异步有什么关系?!我说的是显式文件偏移量。 SetFilePointer 从一开始就已经过时且毫无意义
  • SetFilePointer 绝对不能使用 - 毫无意义的 api。所以建议使用它不好。使用OVERLAPPED 不代表使用异步I/O
  • 为什么使用OPEN_ALWAYS而不是CREATE_ALWAYS? op 想要 如果存在则覆盖 - 所以他正确使用 CREATE_ALWAYS 选项。 OPEN_ALWAYS 在这里是错误的
猜你喜欢
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
相关资源
最近更新 更多