Найдите строку в файле и удалите его

Другая хорошая вещь об итераторах состоит в том, что они лучше позволяют Вам выражать (и осуществлять) Ваше предпочтение константы. Этот пример гарантирует, что Вы не будете изменять вектор посреди своего цикла:


for(std::vector<Foo>::const_iterator pos=foos.begin(); pos != foos.end(); ++pos)
{
    // Foo & foo = *pos; // this won't compile
    const Foo & foo = *pos; // this will compile
}
59
задан Sled 11 June 2014 в 09:17
поделиться

3 ответа

Это решение может быть не оптимальным или красивым, но оно работает. Он считывает входной файл построчно, записывая каждую строку во временный выходной файл. Когда он встречает строку, которая соответствует тому, что вы ищете, он пропускает ее запись. Затем он переименовывает выходной файл. Я исключил из примера обработку ошибок, закрытие читателей / писателей и т. Д. Я также предполагаю, что в строке, которую вы ищете, нет начальных или конечных пробелов. Измените код для trim () по мере необходимости, чтобы найти совпадение.

File inputFile = new File("myFile.txt");
File tempFile = new File("myTempFile.txt");

BufferedReader reader = new BufferedReader(new FileReader(inputFile));
BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));

String lineToRemove = "bbb";
String currentLine;

while((currentLine = reader.readLine()) != null) {
    // trim newline when comparing with lineToRemove
    String trimmedLine = currentLine.trim();
    if(trimmedLine.equals(lineToRemove)) continue;
    writer.write(currentLine + System.getProperty("line.separator"));
}
writer.close(); 
reader.close(); 
boolean successful = tempFile.renameTo(inputFile);
79
ответ дан 7 November 2019 в 04:35
поделиться

Вы хотите сделать что-то вроде следующего:

  • Открыть старый файл для чтения
  • Открыть новый (временный) файл для записи
  • Итерировать над строками в старом файле (возможно, с использованием BufferedReader )
    • Для каждой строки проверьте, совпадает ли она с тем, что вы должны удалить
    • Если она совпадает, ничего не делайте
    • Если она не совпадает, запишите ее во временный файл
  • Когда закончите, закройте оба files
  • Удалите старый файл
  • Переименуйте временный файл в имя исходного файла

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

20
ответ дан 7 November 2019 в 04:35
поделиться
    public void removeLineFromFile(String file, String lineToRemove) {

    try {

      File inFile = new File(file);

      if (!inFile.isFile()) {
        System.out.println("Parameter is not an existing file");
        return;
      }

      //Construct the new file that will later be renamed to the original filename.
      File tempFile = new File(inFile.getAbsolutePath() + ".tmp");

      BufferedReader br = new BufferedReader(new FileReader(file));
      PrintWriter pw = new PrintWriter(new FileWriter(tempFile));

      String line = null;

      //Read from the original file and write to the new
      //unless content matches data to be removed.
      while ((line = br.readLine()) != null) {

        if (!line.trim().equals(lineToRemove)) {

          pw.println(line);
          pw.flush();
        }
      }
      pw.close();
      br.close();

      //Delete the original file
      if (!inFile.delete()) {
        System.out.println("Could not delete file");
        return;
      }

      //Rename the new file to the filename the original file had.
      if (!tempFile.renameTo(inFile))
        System.out.println("Could not rename file");

    }
    catch (FileNotFoundException ex) {
      ex.printStackTrace();
    }
    catch (IOException ex) {
      ex.printStackTrace();
    }
  }

Это я нашел в Интернете.

24
ответ дан 7 November 2019 в 04:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: