我正在构建一个接收串行数据并将其保存到文件的程序。每行数据都有时间戳。在这段代码中,带时间戳的数据行是 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)”。有什么想法吗?
最佳答案
首先,我怀疑 s
包含一些 carriage returns .这会导致光标移动到行首,进一步的输出会覆盖已经打印的内容。要查看打印的实际字符,请将程序的输出重定向到一个文件,然后使用十六进制编辑器/查看器(例如 xxd
)检查结果。
其次,sizeof(s)
不是确定 std::string
长度的正确方法。请改用 s.length()
。这就是 numChars
不正确的原因。
最后,要将字符串写入文件,请使用:
fwrite( s.data(), sizeof(char) , s.length() , DATA_LOG);
关于c++ - 为什么这个 fwrite 写的是垃圾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18388671/