C ++写入文本文件时出现奇怪的字符

时间:2015-09-07 04:14:04

标签: c++ visual-studio-2010 text fstream

我有一个程序,可以在相机拍摄照片时写出帧编号和当前系统时间:

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());
        }

程序输出的文本文件似乎正确地写入数据,但是我得到的空格和字符在每行的开头都不应该存在。网站似乎没有正确格式化空格,所以我会发布一张图片,这就是文本文件的样子。除了零之外,该文件还有时会显示项目符号。

enter image description here

正如你所看到的那样,第一行很好但是我写入文本文件的时间越长越好。该程序每秒写入文件大约10次。我是C ++的新手,我不确定是什么导致了这一点。我试图寻找与此相似的其他问题,但他们似乎没有我想要的解决方案。任何帮助将不胜感激。

2 个答案:

答案 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));
}