Какой лучший способ скопировать текстовый файл? - PullRequest
0 голосов
/ 22 июня 2009

Я копирую текст из одного файла в другой с некоторыми изменениями.

У меня есть input.txt, tmp.txt и output.txt.

Идея состоит в том, чтобы скопировать несколько строк в tmp.txt (пока мы не достигнем разделителя), переместить текст из tmp.txt в output.txt, стереть tmp.txt, а затем продолжить цикл до конца of input.txt.

У меня проблемы с файлом tmp.txt. После первого копирования содержимого поверх него перестает принимать новый текст, даже после того, как я закрыл, удалил и заново открыл файл для записи. Мой код стал очень грязным.

Кто-нибудь может предложить аккуратный способ сделать это? (копирование в tmp.txt, копирование из tmp.txt, стирание tmp.txt, продолжая цикл)

N.b. Это подзадача, в которой я застрял с проблемой домашней работы - я удаляю комментарии c ++ из текстового файла.

Редактировать: Для тех, кто интересуется, зачем мне нужен tmp.txt: Если программа встречает */ (закрытый комментарий) без открытого комментария, то перед этим, до предыдущего комментария, нужно будет обработать все как комментарий. Я использую временный текст для хранения текста, который может быть или не быть комментарием. Если это так - я удалю текст в tmp, если нет, я скопирую текст в tmp в output.txt.

Ответы [ 4 ]

2 голосов
/ 22 июня 2009

Откройте input.txt как istream и output.txt как ostream. Начните чтение с ввода, повторяя все символы, не принадлежащие комментарию. Когда вы сталкиваетесь с комментарием, не пишите в вывод. Это должно сделать это.

1 голос
/ 22 июня 2009

Я предлагаю вам пропустить файл tmp.txt. Этого должно быть достаточно, чтобы просто открыть файл input.txt и просто перетасовать данные в файл output.txt по своему усмотрению.

1 голос
/ 22 июня 2009

Если вы используете материал C ++ fstream, вам может потребоваться вызвать .clear () в потоке при повторном его открытии, чтобы очистить флаги ошибок (например, те, которые установлены при нажатии EOF).

0 голосов
/ 22 июня 2009

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

Если домашнее задание включает удаление комментариев, вы можете просто запустить входной файл в виде потока и прекратить запись выходного файла в комментариях.

  • Вы можете начать с обнаружения start и end комментария,
    • Реализуйте это для комментариев в стиле C и в стиле //, C ++
  • Затем используйте стек и увеличьте масштаб для обнаружения вложенных комментариев.
    • Здесь ваше понимание вложения с обоими стилями комментирования поможет
  • Наконец, вы можете обнаружить блоки #if 0 и #endif - только для ударов: -)
...