0

将字符串向量保存到磁盘未按预期工作。我看到该文件已创建但有 0 个字节且没有条目。注意:我在 Xcode (v4.3.3) 上的 MAC OS 上编译 C++ 代码。

向量和字符串的声明:

vector<string>taskVector;
string newTaskEntry;

这就是我在程序运行时向数组添加新字符串的方式:

taskVector.push_back(newTaskEntry);

当用户退出程序时,我这样做:

        fstream file;
        file.open("data.txt", ios::out | ios::trunc);

        for (int i = 0; i > taskVector.size(); i++) {
            file.write(taskVector[i].c_str(), taskVector[i].length());
            file.close();

知道为什么我没有看到任何条目吗?其次,当我能够将内容保存到磁盘时,你能给我一个提示如何读回数据吗?

4

2 回答 2

5

这是你的问题:

for (int i = 0; i > taskVector.size(); i++)

非常仔细地看那条线。

编辑:至于您的更新,这里有一些提示:

  1. 用于std::getline()逐行读取
  2. 在向量上使用push_back()以插入向量中。
于 2012-07-03T07:41:40.917 回答
3

首先(就像@Nim 提到的)你做错了检查:

for (int i = 0; i > taskVector.size(); i++) {

应该由

for (int i = 0; i < taskVector.size(); i++) {

第二:关闭循环:

for (int i = 0; i > taskVector.size(); i++) {
    file.write(taskVector[i].c_str(), taskVector[i].length());
}
file.close();

关于重新读回它们:现在,你没有保存任何信息,你的字符串在哪里结束,或者它们有多长。没有它,您将不得不猜测字符串在哪里以及(以及它们有多少)。我会推荐以下之一:

要么取一个终止字节,这表明字符串何时在您的文件中结束。'\0'将是一个想法。但是您必须确保它不存在于您的字符串中,或​​者您无法正确地重新创建它们。回读时,在那个字符处拆分。

另一种方法是将字符串的长度信息存储在字符串前面。在存储字符串之前,您可以在前面存储 4 个字节的无符号整数。然后,在回读时,您首先回读 4 字节字符串,然后读取该数字指示的字节数。问题:你需要决定你的字符串最长可以多长(有 4 个字节的长度信息,大约是 4.8 * 10^9 字节,差不多)。如果您打算在不同的计算机上使用它,您可以检查系统的字节顺序(大端与小端)。

于 2012-07-03T07:52:38.200 回答