3

请看一下代码。我是初学者,这是我第一次在 C++ 中创建缓冲区。如何在 C++ 中创建缓冲区以在将旧内容读入该缓冲区并忽略要删除的部分同时截断旧数据并从缓冲区存储内容后创建新文件?

int main() {
    Admin item; // Admin is a class
    ios::pos_type pos;    
    int productId;
    char *ch; // pointer to create buffer
    int length;

    cout << "Enter Product Id of item to delete: ";

    cin >> productId;

    ifstream readFile("Stock.dat", ios::binary | ios:: in | ios::out);

    while (readFile) {
        readFile.read(reinterpret_cast<char*>(&item), sizeof(Admin));

        if (item.getStatus() == productId) {            
            pos = readFile.tellg() - sizeof(Admin);
            break;
        }
    }

    readFile.close();

    ifstream readNewFile("Stock.dat", ios::binary | ios:: in | ios::out);

    readNewFile.seekg(0, ios::end);

    length = readNewFile.tellg();

    ch = new char[length]; // is this how buffer is created?if no, please correct it. 

    readNewFile.seekg(0, ios::beg);

    while (readNewFile) {
        if (readNewFile.tellg() == pos)
            readNewFile.ignore(sizeof(Admin));
        readNewFile.read((ch), sizeof(Admin)); // is this how contents are read into buffer from file stream;

        if (readNewFile.eof())
            readNewFile.close();
    }

    ofstream outFile("Stock.dat", ios::trunc | ios::app);

    outFile.write(ch, sizeof(Admin)); // I am doubtful in this part also

}
4

2 回答 2

4

在 C++ 中,您分配内存来创建缓冲区,如下所示:

char* buffer = new char[length];

您的代码的问题是您使用()而不是[].

当您想释放这些缓冲区的内存时,您可以使用delete[]运算符:

delete[] buffer;

此外,您正在从文件中正确读取,但不是以您期望的方式。这是有效的语法,但问题是,您正在覆盖缓冲区中的数据。

您可能应该像这样阅读:(在循环之前index初始化int到哪里)0while

readNewFile.read(&ch[index], sizeof(Admin));
index = index + sizeof(Admin);

正如评论中的用户所建议的那样,您甚至可以在std::vector<char>此处使用 an,因为它与 a 一样快,char*并且不需要指定的大小:)

于 2013-03-23T19:13:02.190 回答
0

做一个ch = new char[length]。此外,http://www.cplusplus.com/doc/tutorial/dynamic/是一个很好的起点。

顺便说一句,我知道您是初学者,所以我不想让您灰心,但是,如果您在发布之前对易于回答的问题进行研究,那就太好了。

于 2013-03-23T19:17:21.113 回答