Как перезаписать одну строку в файле .dat без перезаписи всего файла? C ++ - PullRequest
0 голосов
/ 09 апреля 2020

Я новичок в C ++, поэтому я не уверен, что разрешено, а что нет. В то время как l oop, я пытаюсь прочитать каждую строку в файле по отдельности, и когда он попадает в строку, соответствующую записи #, предоставленной пользователем (1-100), вся эта строка будет заменена на запись, имя, количество и стоимость, которые были введены пользователем. Однако я не хочу перезаписывать весь файл, потому что пользователь должен иметь возможность вводить другой элемент впоследствии, а предыдущий должен остаться. Я знаю, что для l oop, вероятно, глуп, но я пробовал странные вещи. Я слышал о seekp и seekg, но я скорее не буду использовать классы в этом, если я все еще не могу использовать seekp и seekg и без классов.

В файле 100 записей, отформатированных аналогично этому минусу подчеркивания ( номер записи, название инструмента, количество, стоимость):

0 _____ нет _____ 0 _____ 0,00

Надеюсь, этого достаточно. Я долго боролся с этим.

void addItem(fstream& add)
{
    int record = 0;
    string toolName = "none";
    int quantity = 0;
    double cost = 0.00;

    int rec = 0;
    string tool = "none";
    int qty = 0;
    double cst = 0.0;

    cout << "\nEnter the record number (1-100) : ";
    cin >> record;
    cout << "Enter the name of the tool: ";
    cin >> toolName;
    cout << "Enter the quantity of the tool: ";
    cin >> quantity;
    cout << "Enter the cost of the tool: ";
    cin >> cost;


    while (add >> rec >> tool >> qty >> cst)
    {
        for (int i = 0; i < 100; i++)
        {
            if (rec != 0) { //if existing rec# is not equal to zero, keep the line the same 
                add << setw(6) << rec << setw(14) << tool << setw(10) 
                    << qty << setw(15) << setprecision(2) << fixed << cst << '\n';
            }
            if (rec == record) { //if existing rec# is equal to user input, change line to user input
                add << setw(6) << record << setw(14) << toolName << setw(10) 
                    << quantity << setw(15) << setprecision(2) << fixed << cost << '\n';
            }
            if (i == record) {//if line equals the value of the user input, change line to user input
                add << setw(6) << record << setw(14) << toolName << setw(10) 
                    << quantity << setw(15) << setprecision(2) << fixed << cost << '\n';
            }
            else { //keep any other records as default
                add << setw(6) << 0 << setw(14) << "none" << setw(10) 
                    << 0 << setw(15) << setprecision(2) << fixed << 0.00 << '\n';
            }
        }
    }

    cout << "\n\nYou have added a new record.\n";
}
...