Удаление указанной c записи (или данных) из файла - PullRequest
2 голосов
/ 13 апреля 2020

Я хочу удалить введенную пользователем запись из файла, если он существует. Я написал следующий код для добавления данных в файл: - Может ли кто-нибудь сказать, какой подход я должен использовать для удаления определенной c записи (или данных) из файла? Спасибо!

void addData(char* name, char* data){

   ifstream input_file(name);
   ofstream output_file(name, ofstream::app);

   if (!input_file) {
       output_file << data << endl;
   }
   else {
       output_file << data << endl;
       cout << "This is the first data of this person" << endl;
   }

   input_file.close();
   output_file.close();

 }

1 Ответ

1 голос
/ 14 апреля 2020

Существует в основном 2 подхода.

  1. Открыть исходный файл -> Считать все данные в память -> Закрыть исходный файл -> Выполнить изменения в памяти -> Открыть исходный файл в режиме перезаписи - > Записать новые данные.
  2. Использовать временный файл. -> Открыть исходный файл для ввода -> Открыть временный файл для вывода -> Читать исходный файл построчно -> Немедленно вносить изменения для каждой строки чтения -> Записать результат во временный файл -> После того, как все данные исходного файла были прочитаны , закрыть файлы бота -> Удалить исходный файл. Переименуйте временный файл в старое имя исходного файла

Есть и другие решения, но эти два подхода часто используются.

Пожалуйста, посмотрите некоторые примеры кодов. Просто простой пример. Нет продуктивного кода. Нет проверки ошибок. Просто чтобы дать вам представление о том, как это может работать.

Метод 1

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

std::vector<std::string> readFile(const std::string& filename) {

    // Here we will store all the data from the file
    std::vector<std::string> fileData;

    // Open the source file
    std::ifstream fileStream(filename);

    // Read line by line and add it to our fileData
    std::string line;
    while (std::getline(fileStream, line)) {

        fileData.push_back(line);
    }
    return fileData;
}

void writeFile(std::vector<std::string>& fileData, const std::string& filename) {

    // Open file for output
    std::ofstream fileStream(filename);

    // Write all data to file
    for (const std::string& line : fileData)
        fileStream << line << '\n';
}

int main() {

    // Aproach with read complete file to local variable, modify and the store again
    const std::string dataFileName("r:\\test.txt");

    // Get file content
    std::vector<std::string> data = readFile(dataFileName);


    // Now go through all records and do something
    for (std::string& line : data) {

        // If some condition is met then do something, for example modify
        if (line == "Line1") line += " modified";
    }


    // And then write the new data to the file
    writeFile(data, dataFileName);

    return 0;
}

Метод 2:

#include <iostream>
#include <fstream>
#include <string>
#include <cstdio>

int main() {
    // Aproach with temp file, remove and rename, and on the fly change

    const std::string dataFileName("r:\\test.txt");
    const std::string tempFileName("r:\\temp.txt");

    {
        // Open the source file with data
        std::ifstream dataFileStream(dataFileName);

        // Open the temporary file for output
        std::ofstream tempFileStream(tempFileName);

        // Now read the source file line by line with a simple for loop
        std::string line;
        while (std::getline(dataFileStream, line)) {

            // Identify the line that should be deleted and do NOT write it to the temp file
            if (line != "SearchString") {  // Or any other condition

                // Write only, if the condition is not met
                tempFileStream << line << '\n';
            }
        }
    } // The end of the scope for the streams, will call their destructor and close the files

    // Now, remove and rename
    std::remove(dataFileName.c_str());
    std::rename(tempFileName.c_str(), dataFileName.c_str());

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...