3

我正在构建一个接收串行数据并将其保存到文件的程序。每行数据都有时间戳。在这段代码中,带时间戳的数据行是 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

您可以看到,由于某种原因,“名为 s 的输入字符串”似乎被覆盖了。不过,这并不是我真正关心的问题(尽管我不知道为什么会这样。)

我的主要问题是我的 fwrite 将垃圾保存到文件中。可以看到 numChars 和 string 是正确的。我试过用相同的垃圾结果代替“&s”、“static_cast(&s)”。有任何想法吗?

4

3 回答 3

4

首先,我怀疑s包含一些回车。这会导致光标移动行的开头,进一步的输出会覆盖已经打印的内容。要查看打印的实际字符,请将程序的输出重定向到文件,然后使用十六进制编辑器/查看器(例如xxd)检查结果。

其次,sizeof(s)不是确定 a 长度的正确方法std::string。改为使用s.length()。这就是numChars不正确的原因。

最后,要将字符串写入文件,请使用:

fwrite( s.data(), sizeof(char) , s.length() , DATA_LOG);
于 2013-08-22T18:59:11.647 回答
1

将 a 写入std::string s文件看起来像这样:

fwrite(s.c_str(), 1, s.size(), DATA_LOG); 

查看控制台打印输出时,您的数据可能还有其他问题,但如果没有在调试器或类似设备中看到实际数据,我不确定。

于 2013-08-22T19:03:51.367 回答
0

sizeof(s)真的应该是strlen(s)or 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);
}
于 2013-08-22T19:01:45.280 回答