繁体   English   中英

c ++使用fstream从二进制文件中读取字符串

[英]c++ Reading string from binary file using fstream

我正在尝试从二进制文件中读取一个字符串,但似乎无法让它工作。 我是 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;
}

这是有问题的线路。

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

您正在将std::stringchar*部分直接读入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;

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

char *buffer = new char[size];

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

iFile.read(buffer, size);

而不是这个

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

尝试这个:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM