将字符串作为二进制写入/读取到随机访问的文件中

R. Absil

简单的问题:我想将固定长度的字符串写入二进制文件(即二进制文件),如下面的代码片段所示。

写作“看起来”很好,但从文件中读取不起作用(编译和运行没有崩溃,但没有给出预期的结果)。

#include <iostream>
#include <fstream>
#include <string>

int main()
{
    {
        std::ofstream out {"out.dat", std::ios::binary};

        //all of length 5
        std::string a[] {{"12345"}, {"6789A"}, {"BCDEF"}};

        //write down strings without \0
        out.write(a[0].c_str(), a[0].length());
        out.write(a[1].c_str(), a[1].length());
        out.write(a[2].c_str(), a[2].length());
    }

    {
        std::ifstream in {"out.dat", std::ios::binary};

        std::string s2 {5, '\0'}; //I can store at least 5 chars
        in.seekg(0 + 2 * 5); //try to read string of index 2
        in.read(&s2[0], 5);

        std::cout << s2 << std::endl; //prints "BC", not "BCDEF"  
    }
}

最后一行应该恢复字符串“BCDEF”,但只打印“BC”(g++ 10.2.0)。

由于字符串具有固定长度,并且我将指定数量的字节(字符)写入文件,我应该能够恢复它们seekg(也就是说,我知道它们从哪里开始,并且我可以将输入位置指示器设置为正确在那里阅读)。

请注意,我不这是这个问题的重复,因为我直接写字符(我不需要reinterpret_cast它们)。

泰德·林格莫

这使用带有 的构造函数std::initializer_list

std::string s2 {5, '\0'};

...并创建一个包含 2 个字符的字符串,其值为 5 和 0(或任何\0值)。

应该是 std::string s2 (5, '\0');

示例:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

int main()
{
    {
        std::ofstream out {"out.dat", std::ios::binary};

        //all of length 5
        std::vector<std::string> a{{"12345"}, {"6789A"}, {"BCDEF"}};

        //write down strings without \0
        for(auto& s : a)
            out.write(s.c_str(), s.size());
    }

    {
        std::ifstream in {"out.dat", std::ios::binary};

        std::string s2(5,'\0'); //I can store at least 5 chars
        in.seekg(0 + 2 * 5); //try to read string of index 2
        in.read(s2.data(), 5);

        std::cout << s2 << std::endl; //prints "BC", not "BCDEF"  
    }
}

`

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将大二进制字符串写入二进制文件

从C中的二进制文件读取字符串时发生访问冲突

将十六进制字符串作为二进制数据写入新的 .mid 文件

以二进制模式将十六进制字符串写入文件

将十六进制字符串写入二进制文件

从字符串中写入二进制数据

Python 2.7将字符串元素(字符)写入二进制文件

将二进制文件从字符串写入文件

将二进制文件中的数据读取到C中的链接列表中(访问冲突读取位置)

无法将1和0的字符串写入二进制文件,C ++

如何将二进制字符串写入文件C#

将“8 位”(字节)字符串写入二进制文件?

将(和读取)链表(包含动态字符串)保存到 C 中的二进制文件中

将二进制字符串(ASCII)转换为二进制文件

将二进制文件读入字符串

将 std::map 写入/读取到二进制文件需要运算符

将二进制文件读取为字符串,但类型混合

替换二进制文件中的字符串

如何从二进制文件中读取以nul结尾的字符串

在Ruby中以字符串形式读取二进制文件

关闭程序后如何从二进制文件中读取字符串

将二进制文件读取到vector <char>中,读取的内容少于完整文件

将二进制文件作为二进制字符串或base64存储在indexedDB中会导致文件不可读

如何将二进制文件的内容放在c中的字符串中?

从表示Ruby中十六进制字节的文本字符串写入二进制文件

使用二进制数据将固定宽度的文件读取到Pandas中

将任何文件转换为二进制字符串并从二进制转换为文件

使用awk将二进制数作为字符串存储在文本文件中,然后转换为十六进制

读取/写入二进制文件