如何正确地将字符数组写入文本文件

Posted

技术标签:

【中文标题】如何正确地将字符数组写入文本文件【英文标题】:How to correctly write an array of chars to a text file 【发布时间】:2021-05-07 14:25:20 【问题描述】:

首先,我想指出,尽管使用了 C++,但我不能使用字符串或向量。就像 C 有对象一样。

好的,我有 char* test() 方法的 A 类:

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);

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();

(基于this answer)

但是文件的内容是:

       ¥b ¥b ¥b m

这绝对不是我想要的。内容应该是:

♥b ♥b ♥b 

如何解决?

【问题讨论】:

'♥' 具有实现定义的值,如果 不能用您的字符代码中的一个字节表示。 要么使 to_return 静态并始终在同一缓冲区上返回 char* 指针,要么在每次调用 A::test() 和清理时使用 new/malloc 分配一个新缓冲区(删除/免费)稍后。现在to_return 的内容在函数末尾被释放,所以指向它是未定义的行为。 @MikeCAT 可能不是(尽管它显示在控制台中)。如何修复那个 m88 相同:如何修复它。 @PiotrWasilewicz 我在评论的前半部分确实给了你 2 种方法来解决这个问题。 请注意,如果其字节在可打印字符范围内,提前打印的大小可能会导致一些额外的字符可见。 【参考方案1】:

问题是:

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;

【讨论】:

您忘记了strcpy 中的to_Return 吗?现在它给出了一个错误invalid conversion from const char* to char* @PiotrWasilewicz 抱歉,已修复。 好的。我的代码中还有一个错误——我不应该写这个file.write((char*)&amp;len, sizeof(len));。现在它起作用了。谢谢。 我还有一个问题。因为 heart-sign 来自另一个函数 char getHeart() conts return heart;,而 heart 是:char heart = 3(其中 3 是一个数字)。我试过const char *part = new char(getHeart());,但这不是我的标志。 C 风格的字符串(要处理像 strcpy()strlen() 这样的 C 库)必须由 '\0' 终止。数组应该是const char* part = new char[2]getHeart(), '\0';

以上是关于如何正确地将字符数组写入文本文件的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地将文本文件传递给 NSFileManager

如何将文本文件存储到带有空格的字符数组中?

在vb中如何一次性地将文件内容读取到文本框

php将数组元素按行写入文本文件

如何从SharedPreferences文件中正确地将文本附加到TextView而不是覆盖它?

如何有效地将结构向量写入文件?