【问题标题】:C++ string outputs smiley facesC++ 字符串输出笑脸
【发布时间】:2015-04-05 23:03:26
【问题描述】:

我正在尝试读取二进制文件以获取其各个位值。我正在使用以下函数这样做。

string readFileBytes(const char *name)
{
  ifstream fl(name);
  fl.seekg( 0, ios::end );
  size_t len = fl.tellg();
  char *ret = new char[len+1];    

  fl.seekg(0, ios::beg); 
  fl.read(ret, len);
  fl.close();    
  ret[len] = '\0';

  return ret;
  delete ret;
       }

这很好用。对于下一部分,我将获取数组ret 的每个元素,并使用我编写的以下函数来获取各个位值。

string out;
for (int i=0; i < len; i++)
{


    for (int x =7; x >=0; x--)
    {
    out += ((ret[i]>>x) & 0x01);
    }       
}

如果我在嵌套循环中有cout &lt;&lt; ((ret[i]&gt;&gt;x) &amp; 0x01);,它会完美地打印位值。但是,当我拥有它并打印字符串 (out) 时,我只得到笑脸。

有什么想法吗?

【问题讨论】:

  • 至少操作系统对你的笑脸很好,我的机器只是无聊地显示NULSOHNULNUL...

标签: c++ string


【解决方案1】:

表达式

((ret[i]>>x) & 0x01)

计算为整数01(即01 的数值)。您需要代表01 的字符。试试

out += '0' + ((ret[i]>>x) & 0x01);

相关:Convert an int to ASCII character

【讨论】:

  • 非常感谢!我没有意识到这一点。
【解决方案2】:

二进制 0 或 1 不会产生字符“0”或“1”。您需要将正确的字符代码放入输出字符串中。

【讨论】:

    【解决方案3】:

    return ret;delete ret; 这也是错误的。有任何警告吗?您在return 之后拥有delete
    如果您要删除char*,那么您应该使用delete[] 而不是delete

    【讨论】:

    • OP 可能甚至不应该使用 char*,string 很可能就足够了
    • @Alejandro 可能他正在使用char* 作为传递给ifstream::read 的缓冲区,然后由于std::string 采用char* 的隐式构造函数将其作为std::string 返回。问题是内存泄漏,可以通过使用std::unique_ptr&lt;char&gt; ret(new char[len+1]); 来避免。
    • @Alejandro 然后将它与需要原始指针的ret.get() 一起使用。
    • @Alejandro 我正在使用 char* 因为 ifstream 需要它。
    • @vsoftco ret[len] = '\0' 不处理潜在的内存泄漏问题吗?
    猜你喜欢
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    相关资源
    最近更新 更多