我正在构建一个接收串行数据并将其保存到文件的程序。每行数据都带有时间戳。在此代码中,带时间戳的数据行是s。
string s = get_timestamp();
cout << "input string named s is: " << s << "\n";
numChars = sizeof(s);
cout << "size is: " << numChars << "\n";
fwrite( &s, sizeof(char) , numChars , DATA_LOG);
打印语句输出
00000.27m,379named s is: 20130822.1141,00000.26m,379
size is: 28
您可以看到由于某种原因,&#34;输入字符串名为s&#34;似乎被覆盖了。这不是我的主要关注点(虽然我不知道它为什么会发生。)
我的主要问题是我的fwrite将垃圾保存到文件中。您可以看到numChars和字符串是正确的。我已经尝试过代替&#34;&amp; s&#34;,&#34; static_cast(&amp; s)&#34;具有相同的垃圾结果。有什么想法吗?
答案 0 :(得分:4)
首先,我怀疑s
包含一些carriage returns。这会导致光标移动行的开头,进一步的输出会覆盖已经打印的内容。要查看打印的实际字符,请将程序的输出重定向到文件,然后使用十六进制编辑器/查看器(例如xxd
)来检查结果。
其次,sizeof(s)
不是确定std::string
长度的正确方法。请改用s.length()
。这就是numChars
不正确的原因。
最后,要将字符串写入文件,请使用:
fwrite( s.data(), sizeof(char) , s.length() , DATA_LOG);
答案 1 :(得分:1)
将std::string s
写入文件将如下所示:
fwrite(s.c_str(), 1, s.size(), DATA_LOG);
您的数据可能存在其他问题,查看控制台打印输出,但我不确定如果未在调试器或类似设备中看到实际数据。
答案 2 :(得分:0)
sizeof(s)
应该是strlen(s)
或wcslen(s)
。
如果您使用std::basic_string<>
,.length()
将为您提供长度,.c_str()
将为您提供char string pointer
,而不是&s
指向实际对象的指针。
请尝试:
if(!s.empty()){
fwrite(s.c_str(), sizeof(s.front()), s.length(), DATA_LOG);
}