【问题标题】:c++ Reading string from binary file using fstreamc ++使用fstream从二进制文件中读取字符串
【发布时间】:2014-04-30 23:43:37
【问题描述】:

我正在尝试从二进制文件中读取字符串,但似乎无法正常工作。我是 C++ 的新手。有人可以帮忙吗?谢谢。

string Name = "Shaun";
unsigned short int StringLength = 0;

int main()
{
    StringLength = Name.size();

    ofstream oFile("File.txt", ios::binary|ios::out);
    oFile.write((char*)&StringLength, sizeof(unsigned short int));
    oFile.write(Name.c_str(), StringLength);
    oFile.close();

    StringLength = 0;
    Name = "NoName";

    ifstream iFile("File.txt", ios::binary|ios::in);
    if(!iFile.is_open())
        cout << "Failed" << endl;
    else
    {
        iFile.read((char *)&StringLength, sizeof(unsigned short int));
        iFile.read((char *)&Name, StringLength);
    }

    cout << StringLength << " " << Name << endl;

    system("Pause>NUL");
    return 0;
}

【问题讨论】:

    标签: c++ fstream


    【解决方案1】:

    这是有问题的行。

        iFile.read((char *)&Name, StringLength);
    

    您正在将std::string 的char* 部分直接读入Name 的内存中。

    您需要保存字符串的大小以及字符串,以便在读取数据时知道读取数据需要多少内存。

    代替

    oFile.write(Name.c_str(), StringLength);
    

    你需要:

    size_t len = Name.size();
    oFile.write(&len, sizeof(size_t));
    oFile.write(Name.c_str(), len);
    

    在回来的路上,你需要:

    iFile.read(&len, sizeof(size_t));
    char* temp = new char[len+1];
    iFile.read(temp, len);
    temp[len] = '\0';
    Name = temp;
    delete [] temp;
    

    【讨论】:

      【解决方案2】:

      你需要创建一个 char 类型的缓冲区。

      char *buffer = new char[size];
      

      然后使用你的缓冲区作为参数来读取函数

      iFile.read(buffer, size);
      

      【讨论】:

        【解决方案3】:

        不是这个

        iFile.read((char *)&Name, StringLength);
        

        试试这个:

        Name.resize(StringLength);
        iFile.read((char *)&Name[0], StringLength);
        

        您的原始行从头开始覆盖字符串对象数据,例如,其中可能包含字符串长度和容量,而不是字符数据。此外,您没有适当调整字符串的大小以包含数据。

        【讨论】:

          【解决方案4】:

          从概念上讲,您需要了解正在阅读的数据流。并非所有内容都使用 ASCII,它使用 8 位字节大小。我还注意到您没有设置读取位大小,它可以小到一位,也可以像 {R, B, G, A} 颜色集一样大。使用您的基本二维重复结构化代码。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-06-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-09-05
            • 2013-06-08
            相关资源
            最近更新 更多