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



我有一个文件,其中包含以下信息

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;
};

我确信我在这里做错了什么。有人能帮忙吗?

如果没有看到代码的其余部分,很难准确地说出发生了什么,但我猜你从一个包含以下内容的文件开始:

123 abc 52 23 n234 bcd 14 53 n

然后,我的猜测是,在读取文件后,您可以重新打开它,或者将文件指针倒带到开头,然后写"12345 abc 52 23\n"。这些新字符会覆盖文件第一部分中的现有字符,但保留其余字符,在文件中留下以下内容:

12345 abc 52 23 nbcd 14 53 n

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

打开文件时使用ios_base::app

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

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

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

ofstream outfile (fileName, ofstream::app);

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

相关内容

最新更新