为什么这个fwrite写垃圾?

时间:2013-08-22 18:54:23

标签: c++ string fwrite

我正在构建一个接收串行数据并将其保存到文件的程序。每行数据都带有时间戳。在此代码中,带时间戳的数据行是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;具有相同的垃圾结果。有什么想法吗?

3 个答案:

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