如何在不覆盖其他数据的情况下编辑文件中的数据?

时间:2013-11-26 18:52:27

标签: c++

我有一个包含以下信息的文件

123 abc 52 23
234 bcd 14 53

在我完成编辑后(顶行中的ID),它就像这样

12345 abc 52 23
 bcd 14 53

执行此操作的代码是:

if (choiceSecond == 1)
{
    cout << "Enter new ID: ";
    cin >> ToyInformation[choiceFirst].ID;
    outfile << ToyInformation[choiceFirst].ID << " "
            << ToyInformation[choiceFirst].Name << " "
            << ToyInformation[choiceFirst].Price << " "
            << ToyInformation[choiceFirst].Quantity << " " << endl;
}

结构:

    struct toys
{
    int ID;
    char Name[31];
    float Price;
    int Quantity;
};

我确定我在这里做错了什么。有人可以帮忙吗?

4 个答案:

答案 0 :(得分:1)

如果没有看到其余的代码,很难确切知道发生了什么,但我的猜测是你从包含这个代码的文件开始:

123 abc 52 23 \n234 bcd 14 53 \n

然后,我的猜测是,在读取文件后,重新打开它或将文件指针倒回到开头并写入“12345 abc 52 23 \ n”。这些新字符会覆盖文件第一部分中的现有字符,但保留其余字符,并将其保留在文件中:

12345 abc 52 23 \nbcd 14 53 \n

您可能不希望覆盖下一行的第一部分。所以你需要做的是读取整个文件(可能是一个向量或字符串列表),在内存中更新你想要的行,然后将它们全部写回来。或者当您在文件中读取时,您在将它们写回到另一个文件时更新所需的行,并将新输出与旧输出交换。

答案 1 :(得分:0)

当您打开文件时,请使用ios_base::app

ofstream outfile("myfilename", ios_base::app);

这会导致所有输出都附加到文件的末尾(我猜是你想要的)。

答案 2 :(得分:0)

定义outfile时,您可以使用模式ofstream::app,就像那样

ofstream outfile (fileName, ofstream::app);

答案 3 :(得分:0)

您想要更改文件中的某些数据而不更改其余数据。一般的答案是不可能的。您只能将某些字节替换为其他字节,但如果您的编辑涉及插入或删除字节,则必须覆盖文件的其余部分。