关于WriteFile的输出的疑问。

本文介绍了一个用于调试的TXT输出函数遇到的问题:输出内容出现乱码,尤其是中英文混合时;以及每次输出都会覆盖原有内容而非追加。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写了一个输出TXT的函数,主要用于调试。
希望实现的是在UNICODE和多字节下都能用。(注:优先考虑UNICODE)

源码如下

void TraceToText(LPCTSTR lpBuffer)
{
    //问题---------------------
    //1:为什么我输出的,是乱码?特别是当中英文混合的时候。注:我外部使用的TCHAR tsTrace[2048]这种数组滴。
    //2:请问,为什么我输出的内容,不能自动跟到后面。会覆盖前面的呢?
    //谢谢

    //1)加上系统当前时间在前面
    CString szTrace;
    SYSTEMTIME sysTime;
    GetLocalTime(&sysTime);
    szTrace.Format(_T("%02u:%02u:%02u  "),sysTime.wHour,sysTime.wMinute,sysTime.wSecond);
    szTrace += lpBuffer;

    //2)加上换行符
    szTrace += _T("\r\n");

    //3)输出
    HANDLE hFile;
    DWORD dwBuffer = 0;
    hFile = CreateFile(_T("C:\\TraceToText.txt"),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);

    WriteFile(hFile,szTrace.GetBuffer(),szTrace.GetLength()*sizeof(TCHAR),&dwBuffer,NULL);

    szTrace.ReleaseBuffer();
    CloseHandle(hFile);

}


如上,有两个问题
    //问题---------------------
    //1:为什么我输出的,是乱码?特别是当中英文混合的时候。注:我外部使用的TCHAR tsTrace[2048]这种数组滴。
    //2:请问,为什么我输出的内容,不能自动跟到后面。会覆盖前面的呢?
    //谢谢

哪位大大说下哇,谢谢~
#include <windows.h> #include <iostream> #include <string> #include <thread> #include <atomic> class SerialPort { private: std::atomic<bool> connected; // 连接状态 HANDLE hSerial; // 串口句柄 COMSTAT status; // 串口状态 DWORD errors; // 错误代码 public: SerialPort() : connected(false), hSerial(INVALID_HANDLE_VALUE) {} // 构造函数 ~SerialPort() { disconnect(); } // 析构函数 bool connect(const std::string& portName, DWORD baudRate = CBR_115200) { disconnect(); hSerial = CreateFileA(portName.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hSerial == INVALID_HANDLE_VALUE) { std::cerr << "Error opening serial port" << std::endl; return false; } DCB dcbSerialParams = { 0 }; dcbSerialParams.DCBlength = sizeof(dcbSerialParams); if (!GetCommState(hSerial, &dcbSerialParams)) { std::cerr << "Error getting serial port state" << std::endl; return false; } dcbSerialParams.BaudRate = baudRate; dcbSerialParams.ByteSize = 8; dcbSerialParams.StopBits = ONESTOPBIT; dcbSerialParams.Parity = NOPARITY; if (!SetCommState(hSerial, &dcbSerialParams)) { std::cerr << "Error setting serial port state" << std::endl; return false; } COMMTIMEOUTS timeouts = { 0 }; timeouts.ReadIntervalTimeout = 50; timeouts.ReadTotalTimeoutConstant = 50; timeouts.ReadTotalTimeoutMultiplier = 10; timeouts.WriteTotalTimeoutConstant = 50; timeouts.WriteTotalTimeoutMultiplier = 10; if (!SetCommTimeouts(hSerial, &timeouts)) { std::cerr << "Error setting timeouts" << std::endl; return false; } connected = true; PurgeComm(hSerial, PURGE_RXCLEAR | PURGE_TXCLEAR); return true; } void disconnect() { if (connected) { CloseHandle(hSerial); connected = false; } } bool sendCommand(const std::string& command) { if (!connected) { std::cerr << "Serial port not connected" << std::endl; return false; } DWORD bytesWritten; if (!WriteFile(hSerial, command.c_str(), command.length(), &bytesWritten, NULL)) { std::cerr << "Error sending command" << std::endl; return false; } return true; } bool readResponse(std::string& response) { if (!connected) { std::cerr << "Serial port not connected" << std::endl; return false; } DWORD bytesRead; char buffer[128]; if (!ReadFile(hSerial, buffer, sizeof(buffer) - 1, &bytesRead, NULL)) { std::cerr << "Error reading response" << std::endl; return false; } buffer[bytesRead] = '\0'; response = buffer; return true; } }; int main() { SerialPort serialPort; if (!serialPort.connect("COM3")) { // 替换为你的串口名称 return 1; } std::cout << "Connected to serial port. Send '0' to stop motor, '1' to start motor." << std::endl; while (true) { std::string command; std::cout << "Enter command (0 or 1): "; std::cin >> command; if (command == "0" || command == "1") { if (serialPort.sendCommand(command)) { std::string response; if (serialPort.readResponse(response)) { std::cout << "Response from motor: " << response << std::endl; } } } else { std::cout << "Invalid command. Please enter '0' or '1'." << std::endl; } } serialPort.disconnect(); return 0; }详细注释一下
最新发布
05-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值