Гриб_под_зонтом, у тебя главная трабла в этом:
in >> s;
Оператор >> в данном случае перегружен и является форматированным, т.е. шлёт нафиг все пробельные символы, среди которых \r и \n. Используй
s=in.get();
Правда у тебя другие траблы вылезут (останется \r, которую надо игнорить и конец файла станет поломанным, т.к. ты через char пытаешься переносить, а в хедерах eof - int и как следствие в конец файла ты впихнешь значение этого eof(сам eof на HDD или где-то ещё (кроме хедера) не хранится, это лишь константа, которая возвращается, как признак конца файла)). Можешь их пофиксить, можешь просто построчно читать или в буфер (быстрее должно быть по идее) и добавлять в конце :. Т.е. минимально твой код должен быть таким (проверки на состояние потока и сообщения, если он поломан сам сделай)
#include <iostream>
#include <fstream>
int main()
{
std::fstream in("IP.txt");
std::ofstream out("IPv.txt");
int s;//EOF в char не полезет.
while(in.good())//не по EOF заканчиваем чтение, а по плохому потоку
{
s=in.get();
if(s == '\n')
{
s = (int)':';
}
if(s!='\r'&&s!=EOF)
{
out << (char)s;
}
}
in.close();
out.close();
}
Если тебе в самом конце не нужно двоеточие, то подумай, как его оттуда убрать.