【问题标题】:C++ string to C char array for writing to binary file用于写入二进制文件的 C++ 字符串到 C char 数组
【发布时间】:2019-03-11 14:33:55
【问题描述】:

我正在尝试在二进制文件中写入和读取字符串,但我不明白为什么 sizeof(t) 返回 4。

//write to file
ofstream f1("example.bin", ios::binary | ios::out);
string s = "Valentin";
char* t = new char[s.length()+1];
strcpy(t, s.c_str());
cout << s.length()+1 << " " << sizeof(t) << endl; // prints 9 4
for(int i = 0; i < sizeof(t); i++)
{
    //t[i] += 100;
}
f1.write(t, sizeof(t));
f1.close();

// read from file
ifstream f2("example.bin", ios::binary | ios::in);
while(f2)
{
    int8_t x;
    f2.read((char*)&x, 1);
    //x -= 100;
    cout << x;  //print Valee
}
cout << endl;
f2.close();

我在 char* 数组 t 中放入什么大小并不重要,代码总是打印“4”作为它的大小。要写入超过 4 个字节的数据,我必须做什么?

【问题讨论】:

  • sizeof(t) 只是给你一个指针的大小,因为这就是 t 的大小。如果您想要为t 分配的内存大小,为什么不改为s.length()+1
  • 为什么所有这些有氧运动都带有char *的字符串?字符串有一个data(),这可能就是你所需要的
  • sizeof 运算符返回 type 的静态大小。它在编译时变成一个常数(无论如何,在 C++ 中,在 C 中有 VLA)。 32 位二进制文​​件的指针大小通常为 4,64 位二进制文​​件的指针大小通常为 8。
  • sizeof(t) -> strlen(t)。但请考虑第二条评论。

标签: c++ arrays string


【解决方案1】:

这是编写代码的简单方法

//write to file
ofstream f1("example.bin", ios::binary | ios::out);
string s = "Valentin";
f1.write(s.c_str(), s.size() + 1);
f1.close();

编辑 OP 实际上想要这样的东西

#include <algorithm> // for transform

string s = "Valentin";
// copy s to t and add 100 to all bytes in t
string t = s;
transform(t.begin(), t.end(), t.begin(), [](char c) { return c + 100; });
// write to file
ofstream f1("example.bin", ios::binary | ios::out);
f1.write(t.c_str(), t.size() + 1);
f1.close();

【讨论】:

  • 谢谢,但我希望在每个字符(我相信它是 ASCII dec 数字)中添加一些数字(在我的代码中的 for 循环中 +100),如此简单的写(s.c_str () ...) 不适合我。
  • @user3007875 好的,我错过了你的那部分代码。这是一件非常奇怪的事情,但你确定你做对了吗?你不会是第一个花费很长时间试图解决错误问题的新手。请参阅对我的答案的编辑以获取也可以执行此操作的版本。
  • 您是否从已编辑的部分测试了您的代码?我复制粘贴它,它在转换行中引发错误(没有匹配的函数调用)。无论如何,它适用于我的原始代码(带有 for 循环),所以问题解决了。我将您的答案标记为正确,谢谢。
  • @user3007875 你有#include &lt;algorithm&gt;吗?如果你这样做了,那么试试std::transform 而不是transform
  • 我做到了。我的整个代码: ''' #include #include #include #include using namespace std; int main() { string s = "Valentin"; // 将 s 复制到 t 并将 t 字符串中的所有字节加 100 t = s; ransform(t.begin(), t.end(), [](char c) { return c + 100; }); // 写入文件 ofstream f1("example.bin", ios::binary | ios::out); f1.write(t.c_str(), t.size() + 1); f1.close(); } ''' 抛出同样的错误。不管怎样,现在都无所谓了,不过谢谢你的帮助。
【解决方案2】:

sizeof(char*) 打印指向 (a) char(s) 的指针使用的大小。在你的平台上是 4。

如果你需要字符串的大小,你应该使用strlen。或者,简单地说,s.length()

【讨论】:

  • 如果内部 NUL 无法解释,这些可能会有所不同。
【解决方案3】:

char *t 是一个指针,而不是一个数组,所以sizeof 将返回你机器上一个指针的大小,显然是 4 个字节。

确定C风格字符串长度的正确方法是包含&lt;cstring&gt;并使用std::strlen

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-10
    • 2012-06-08
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多