2013-03-23 2 views
3

Пожалуйста, посмотрите код. Я новичок, и это первый раз, когда я создаю буфер на C++. Как создать буфер в 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

В C++, вы выделяете память для создания буферов, как это:

char* buffer = new char[length]; 

Проблема с кодом является то, что вы использовали () вместо [].

Если вы хотите, чтобы освободить память этих буферов, вы используете delete[] оператор:

delete[] buffer; 

Кроме того, вы правильно чтение из файла, но не так, как вы ожидаете. Это допустимый синтаксис и все, но проблема в том, что вы перезаписываете данные в своем буфере.

Вы, вероятно, следует читать следующим образом: (где index является int инициализируется 0 перед циклом while)

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

Как пользователь в комментариях предложил, вы можете даже использовать std::vector<char> здесь, так как это так же быстро, как char*, и он не нуждается в указанном размере :)

+2

+1 для ответа. Тем не менее, OP должен полностью исключить «новый/удалить» и просто изменить размер 'std :: vector <>'. – WhozCraig

+0

@ Magtheridon96 сделал исправление, которое вы сказали, но все же код не удаляет нужный элемент из файла, есть ли что-то неправильно во время записи и чтения в буфер в моем коде? – Udit

+0

Попробуйте напечатать содержимое таких переменных, как 'pos' и, возможно, буфер' ch' в консоли. –

0

Сделайте ch = new char[length]. Кроме того, http://www.cplusplus.com/doc/tutorial/dynamic/ является хорошей отправной точкой.

В стороне, я понимаю, что вы новичок, поэтому я не хочу вас огорчать, но было бы здорово, если вы сделаете свой research по вопросам, которые легко отвечать перед публикацией.

Смежные вопросы