Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Подскажите ... удаление сивола...  (Прочитано 7891 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Anonymous
Гость
« : 31-01-2004 10:50 » 

Люди подскажите как удалить символ '\n'
а то присчитывании строки из файла

char chbuf[256];
ifstream ifile("Readme.txt", ios::in);
...
ifile.getline(chbuf, 256, '\n');

на конце строки появляется "string|"
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 31-01-2004 13:51 » 

Убирает символы \r и \n в любом колличестве с конца файла.
Код:
void chomp(char *str) {
  char *p=(char*)(strlen(str)+(int)str-1); // strlen() можно заменить на самомтоятельный поиск концевого нуля: for(p=str;*p;p++); p--;

  while(*p=='\n' || *p=='\r') p--;
  p++;
  *p=0;
  }
« Последнее редактирование: 23-11-2007 21:03 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Anonymous
Гость
« Ответ #2 : 01-02-2004 00:26 » 

Понянтое решене но хотелось бы не использовать
самодельных функций должны быть стандартные
функции С  по удалнию символа '\n' или другого
дело в том что если строка у меня по каким либо
причинам будет очень длиная то процес удаления
может очень замедлить загрузку данных
предложеная функция тобой RXL не совсем подходит
Записан
grozny
Гость
« Ответ #3 : 01-02-2004 02:25 » 

Цитата
длиная то процес удаления
может очень замедлить загрузку данных

звиняюсь, но это утверждение - полная фигня Ага .

Самая медленная операция здесь - чтение файла, и процессор фактически стоит пока идут любые операции с диском. Даже если файл полностью в процессорной кэши, всё равно времени пробежать по строке будет выше крыши. Это O(strlen(chbuf)) тактов. Причём константа где-то 3-4 (проверь ассемблерный листинг). Что даст по верхней границе 256*4= 1024 такта. 1 ГГц процессор обработает миллион таких (256 символов) строк в секунду. Это 1 Гб  :!: . Оперативной памяти хватит на секунду в лучшем случае  Отлично . А у диска время доступа в лучшем случае 5 мс. Сеть - ещё медленее (если не гигабит).

Тем не менее, способов минимизировать возню с символами много. Хотя код RXL вполне работоспособен и фактически есть strrchr (поиск с конца строки) плюс забиение нулями найденного. Ну если использовать поиск с начала, то можно написать типа проще (хотя вариант RXL будет быстрее для "нормальных случаев" большого кол-ва не-переводов строк и малого - переводов строк в конце)

вариант 1:
Код:
char* cp=strchr(chbuf,'\n'); 
if(cp) *cp=0;

вариант 2:
Код:
char* cp; 
(cp=strchr(chbuf,'\n'))?*cp=0:;

Ну и надо бы написать
Код:
#pragma intrinsic(strchr) 
чтобы эта библиотечная ф-ция компилировались инлайном. Съэкономишь с десяток тактов на call/ret Ага
« Последнее редактирование: 23-11-2007 21:16 от Алексей1153++ » Записан
Sashok
Молодой специалист

us
Offline Offline
Пол: Мужской

« Ответ #4 : 01-02-2004 15:40 » new

Цитата: Anonymous
Понянтое решене но хотелось бы не использовать
самодельных функций должны быть стандартные
функции С  по удалнию символа '\n' или другого
дело в том что если строка у меня по каким либо
причинам будет очень длиная то процес удаления
может очень замедлить загрузку данных
предложеная функция тобой RXL не совсем подходит
get c теми же параметрами, что и getline, не извлекает \n из потока. Правда, после этого надо делать допольнительный пустой get(), чтобы извлечь '\n'.
Записан

Если бы окружающие нас объекты содержали столько же ошибок, сколько программы, цивилизация обрушилась бы от первого порыва ветра...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines