c++ - 为什么这个 fwrite 写的是垃圾?

标签 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

您可以看到,出于某种原因,“名为 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/

相关文章:

c - fwrite() 无法在二进制文件中写入整数

c - 如何使用fwrite写入数据0xf0f0f0f0

python - 无法将像素以正确的形状从 cv 代码传输到 cv2 代码

c++ _vsnprintf 意外的格式字符串

c++ - MySQL数据库和内存之间的实体持久化

arrays - 如何在golang中对数组中的字符串进行打乱?

ios - Swift - UITableViewCell 更新 UILabel 文本时跳转

php - is_writable() 返回 false

c++ - 我可以在这里使用 reinterpret_cast 吗?

c# - 将 boolean 值更改为与初始值相反的值