如何正确地将字符数组写入文本文件
How to correctly write an array of chars to a text file
首先,我想指出,尽管使用 C++,但我不能使用字符串或向量。它就像 C 中的对象。
好的,我有 class 一个带有 char* test() 方法的方法:
char* A::test()
{
char to_return[3*this->some_value+3];
for (int i = 0; i < this->some_value; i++)
{
to_return[3*i] = '♥';
to_return[3*i+1] = 'b';
to_return[3*i+2] = ' ';
}
char* dto_return = to_return;
return std::move(dto_return);
}
class B 的对象中的下一个我有:
ofstream file;
file.open("myfile.txt", ofstream::out | ofstream::trunc);
file.close();
file.open("myfile.txt");
char* to_write = a_obj->test();
size_t len = strlen(to_write);
file.write((char*)&len, sizeof(len));
file.write(to_write, len);
file.close();
(基于)
但是文件的内容是:
¥b ¥b ¥b m
这绝对不是我要找的。内容应该是:
♥b ♥b ♥b
如何解决?
问题是:
to_return
是一个局部数组,在从函数返回时结束其生命周期,因此返回它的指针是个坏主意。
'♥'
可能与您想要的不同,尤其是当 ♥
不能用您的字符代码中的一个字节表示时。
克服这个问题:
- 分配一个从函数返回后仍然存在的动态数组。
- 使用字符串文字来表示要添加的字符。
char* A::test()
{
const char *part = "♥b ";
size_t part_len = strlen(part);
char *to_return = new char[part_len*this->some_value+1];
for (int i = 0; i < this->some_value; i++)
{
strcpy(to_return + part_len * i, part);
}
return to_return;
}
返回的动态数组使用完成后需要通过delete[]
释放
char* to_write = a_obj->test();
// ...
delete[] to_write;
首先,我想指出,尽管使用 C++,但我不能使用字符串或向量。它就像 C 中的对象。
好的,我有 class 一个带有 char* test() 方法的方法:
char* A::test()
{
char to_return[3*this->some_value+3];
for (int i = 0; i < this->some_value; i++)
{
to_return[3*i] = '♥';
to_return[3*i+1] = 'b';
to_return[3*i+2] = ' ';
}
char* dto_return = to_return;
return std::move(dto_return);
}
class B 的对象中的下一个我有:
ofstream file;
file.open("myfile.txt", ofstream::out | ofstream::trunc);
file.close();
file.open("myfile.txt");
char* to_write = a_obj->test();
size_t len = strlen(to_write);
file.write((char*)&len, sizeof(len));
file.write(to_write, len);
file.close();
(基于
但是文件的内容是:
¥b ¥b ¥b m
这绝对不是我要找的。内容应该是:
♥b ♥b ♥b
如何解决?
问题是:
to_return
是一个局部数组,在从函数返回时结束其生命周期,因此返回它的指针是个坏主意。'♥'
可能与您想要的不同,尤其是当♥
不能用您的字符代码中的一个字节表示时。
克服这个问题:
- 分配一个从函数返回后仍然存在的动态数组。
- 使用字符串文字来表示要添加的字符。
char* A::test()
{
const char *part = "♥b ";
size_t part_len = strlen(part);
char *to_return = new char[part_len*this->some_value+1];
for (int i = 0; i < this->some_value; i++)
{
strcpy(to_return + part_len * i, part);
}
return to_return;
}
返回的动态数组使用完成后需要通过delete[]
释放
char* to_write = a_obj->test();
// ...
delete[] to_write;