while (filein >> temp)
Эта переменная temp
является std::string
.Оператор форматированного извлечения >>
, перегрузка для std::string
пропускает все пробельные символы (пробелы, символы табуляции, переносы строк) во входных данных и полностью их отбрасывает.Этот отформатированный оператор извлечения отбрасывает все пробельные символы до первого непробельного символа, затем извлекает его и все последующие непробельные символы и помещает их в std::string
, который является этой переменной temp
.Вот как это работает.
Впоследствии:
fileout << temp;
Затем эта строка записывается в вывод.В показанном коде нет ничего, что указывало бы вашему компьютеру скопировать все пустое пространство с входа на выход, как есть.Единственное, что делает показанный код, это извлекает каждую последовательность непробельных символов из входного файла, немедленно выбрасывая на пол все пробелы и символы новой строки, чтобы их больше никогда не было видно;и затем напишите, что осталось (с соответствующими изменениями) в выходной файл.И компьютер всегда будет делать именно то, что вы говорите, а не то, что вы хотите.
while (filein >> temp)
Здесь все пробелы во входном файле выбрасываются в корзину и удаляются.Поэтому вы хотите сохранить их и скопировать в выходной файл, так как вам придется заменить это.
Здесь можно использовать несколько подходов.Самое простое решение - просто прочитать входной файл по одному символу за раз.Если это не пробельный символ, добавьте его в буфер temp
.Если это пробельный символ, а temp
не пустой, значит, вы только что прочитали полное слово;проверьте, нуждается ли он в замене;запишите это в выходной файл;очистить буфер temp
(при подготовке к чтению следующего слова);а затем вручную записать только что прочитанный символ пробела в выходной файл.Таким образом, вы будете копировать входные данные в выходные данные, по одному символу за раз, включая пробелы, но буферизуя непробельный символ в буфере temp
, пока каждое полное слово не будет прочитано, прежде чем копировать его в выходной файл.И вам также понадобится обработать крайний случай обработки самого последнего слова в файле, без пробелов.