我有一个程序,可以在相机拍摄照片时写出帧编号和当前系统时间:
SYSTEMTIME st;
GetSystemTime(&st);
lStr.Format( _T("%d %d.%d.%d.%d\r\n"),GetFrames() ,st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
std::wfstream myfile;
myfile.open("test.txt", std::ios::out | std::ios::in | std::ios::app );
if (myfile.is_open())
{
myfile.write((LPCTSTR)lStr, lStr.GetLength()*sizeof(TCHAR));
myfile.close();
}
else {lStr.Format( _T("open file failed: %d"), WSAGetLastError());
}
程序输出的文本文件似乎正确地写入数据,但是我得到的空格和字符在每行的开头都不应该存在。网站似乎没有正确格式化空格,所以我会发布一张图片,这就是文本文件的样子。除了零之外,该文件还有时会显示项目符号。
正如你所看到的那样,第一行很好但是我写入文本文件的时间越长越好。该程序每秒写入文件大约10次。我是C ++的新手,我不确定是什么导致了这一点。我试图寻找与此相似的其他问题,但他们似乎没有我想要的解决方案。任何帮助将不胜感激。
答案 0 :(得分:2)
解决方案有两部分:
lStr.Format( _T("%d %d.%d.%d.%d\r\n"),GetFrames() ,st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
应该是
lStr.Format( _T("%lu %d.%d.%d.%d\n"),GetFrames() ,st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
当GetFrames()
返回DWORD
unsigned long
并且您正在将文件写为文本时,\n
会根据需要转换为\r\n
,具体取决于操作系统。
另一部分是wfstream::write
的第二个参数是字符数而不是字节数
myfile.write((LPCTSTR)lStr, lStr.GetLength()*sizeof(TCHAR));
应该是
myfile.write((LPCTSTR)lStr, lStr.GetLength());
答案 1 :(得分:1)
使用std::wfstream::write
(basic_ostream)时,它会占用字符串的大小。您将该大小再次乘以* sizeof(TCHAR)
。删除这个额外的乘法应该只是解决你的问题。
虽然如果您遇到其他任何问题(例如,第三方库返回的空格太多),您可以随时修剪字符串。
一个基本的例子:
template<class TString>
static inline TString &trim_left(TString &s)
{
s.erase(std::begin(s), std::find_if(std::begin(s), std::end(s), std::not1(std::ptr_fun<int, int>(std::isspace))));
return s;
}
template<class TString>
static inline TString &trim_right(TString &s)
{
s.erase(std::find_if(s.rbegin(), s.rend(), std::not1(std::ptr_fun<int, int>(std::isspace))).base(), std::end(s));
return s;
}
template<class TString>
static inline TString &trim(TString &s)
{
return trim_left(trim_right(s));
}