IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Удалить из текста символ!
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 45
Пол: Мужской

Репутация: -  0  +


Люди помогите плиз срочно. скоро сессия а немогу прогу сделать чтоб работала.
вообщем суть такова: надо считать файл, и если в нем попадается заданный символ, удалить его, но потом надо будет вернуть обратно. например, удалим пробелы из строки файла:

__ABC_____FDC__
чтобы допустим получилось
2,3ABC5,3FDC2,0

Получается что цифра перед запятой - это количество пробелов или последовательно идущих символа, а после запятой - через сколько символов опять будет пробел. Причем сделать мне это надо именно так (препод так сказал)

Язык программирования С++ Builder но тут вроде нету неизвестных функций
вот что получилось

void __fastcall TForm1::delClick(TObject *Sender)
{
char p[255];
sym=Edit->Text;
output=fopen ("WWW.txt","w");
u=0;
g=sym[1]; - это символ который надо удалить
i=0;
c=',';
while (!feof(input)) пока не конец файла
{
if (feof(input)) break;

fgets (p,255,input); считываем строку
for (i=1;i<strlen(p);i++) пока не конец строки
{
u=0; nu=0; u- количество подряд идущих пробелов например; nu-через сколько символов опять будет пробел
if (p[i]==g) {
k=i;
while (p[i]==g){ считаем кол-во повторов символа
u++;
i++;
}
while (p[i]!=g){ считаем через сколько опять пробел будет
i++;
nu++; }
s=IntToStr(u);
r=s[1];
fwrite (&r,sizeof(char),1,output);
fwrite (&c,sizeof(char),1,output);
s=IntToStr(nu);
r=s[1];
fwrite (&r,sizeof(char),1,output);}
else
{
while (p[k]==g)
k++;
fwrite (&p[k],sizeof(char),1,output);}

}

}
fclose (input);
fclose (output);
Mem->Clear();
output=fopen ("WWW.txt","r");
Mem->Lines->LoadFromFile("WWW.txt");
}


Сообщение отредактировано: Lapp -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Цитата
А это вообще C++ Builder 6 или 2007 ?

А тут не используется ничего такого, что изменилось бы, начиная с 6 версии. Я бы сказал, никаких специальных "примочек" Билдера тут вообще не используется. За исключением AnsiString и IntToStr все остальное - стандартные средства С++...

Теперь о том, что тебе не было понятно. Смотри:

// пробегаем по всей строке buffer, используя указатель на строку
for(char *p = buffer; *p; p++) {

// Сначала - пропускаем все символы, которые НЕ являются удаляемыми (т.е., пока
// очередной символ не является удаляемым, увеличиваем p, что означает переход
// к следующему символу строки buffer). По окончании этого цикла while переменная
// p будет указывать на первый удаляемый символ.
while(*p != to_delete) p++;

// Теперь надо посчитать, сколько удаляемых символов идут подряд
// Опять же увеличиваем указатель, пока текущий символ равен to_delete
// одновременно с этим, кстати, еще и увеличиваем счетчик (count)
while(*p == to_delete) {
count += 1;
p++; // что тут тебе было не понятно - я не знаю, это и есть переход на следующий символ строки
}

// В этой строке будут храниться все символы, следующие ПОСЛЕ удаляемых,
// для того чтобы вычислить расстояние до следующей группы пробелов (ну, или чего там у тебя)
AnsiString after = "";

// Здесь - использование преимуществ цикла for
// ОБЫЧНО в цикле for указываются начальные значения переменных ";" условие продолжения
// цикла ";" и оператор, выполняемый при переходе на следующую итерацию...
// У меня нет первого парамента, то есть, начальное значение p я не задаю, его значение останется
// таким же, каким и было при выходе из предыдущего цикла while...

// А вот продолжаться этот for будет, пока не будет достигнут конец строки
// (*p равносильно *p != 0, то есть, как только *p станет равным 0 - конец строки - цикл прервется)
// и очередной символ не будет являться пробелом (как только дойдем до следующего пробела -
// цикл тоже прервется)
for(; *p && *p != to_delete; *p++) {
// Что же делаем в цикле?
// Очень просто: добавляем очередной просмотренный символ в строку
after += *p;
}

// Ну, и собираем изо всех элементов результат, который нужен: счетчик пробелов, запятая,
// сколько символов будет до следующего пробела и сама строка до следующего пробела
result +=
IntToStr(count) + "," + IntToStr(after.Length()) + after;

// Не забываем сбросить счетчик, чтобы при следующем подсчете пробелов он считал правильно
count = 1;
}


А вообще-то тебе надо разобраться с указателями (это вообще рабочий инструмент в С++, без понимания, как они работают, тебе будет очень сложно что-то написать) и со строками.

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 45
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 18.12.2007 21:34) *


А вообще-то тебе надо разобраться с указателями (это вообще рабочий инструмент в С++, без понимания, как они работают, тебе будет очень сложно что-то написать) и со строками.


Круто. Вроде все теперь понял. Спасибо. Да на лекциях про указателя я наверно спал просто или в дурака играл. не помню.

Это седня попробую. А вот теперь при нажатии на вторую кнопку. надо все это вернуть из второго файла(т.е заданный символ в те места где он стоял) вот и там вот делать так чтоб допустим если цифра встречается сравнивать ее с множеством чисел если совпадает, то и т.д. .... Так наверно сделать??
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Child of Bodom   Удалить из текста символ!   18.12.2007 14:03
Lapp   Почему в паскалевском разделе?.. Переношу в С.   18.12.2007 18:09
volvo   Child of Bodom, так что-ли: #include <fstream.…   18.12.2007 20:35
Child of Bodom   Child of Bodom, так что-ли: #include <fstream…   19.12.2007 0:52
volvo   А тут не используется ничего такого, что изменило…   19.12.2007 1:34
Child of Bodom   А вообще-то тебе надо разобраться с указателями …   19.12.2007 11:45
volvo   Восстановление исходной строки я бы делал так: vo…   19.12.2007 15:17
Child of Bodom   А вот еще у меня вопросик. Можно ли по этой технол…   19.12.2007 18:24
volvo   В принципе, если ты знаешь формат файла, который ч…   19.12.2007 19:14
Child of Bodom   void __fastcall TForm1::delClick(TObject *Sender) …   19.12.2007 23:55
volvo   Вот так там будет: void __fastcall TForm1::Button6…   20.12.2007 0:26
Child of Bodom   Так вывод я попробую по аналогии сделать. Спасибо …   20.12.2007 1:10
Child of Bodom   Слушай че то не то получается. Например, пишу удал…   20.12.2007 2:15
volvo   for(char *p = buffer; *p; p++) { // while(*p …   20.12.2007 21:16
Child of Bodom   оооо круто работает!!!! Спасибо :)…   20.12.2007 22:55
Child of Bodom   ой я скоро покончу с собой:(( препод начал проверя…   21.12.2007 16:14
volvo   А теперь расскажи, что ИМЕННО ты вводишь? У тебя в…   21.12.2007 16:57
Child of Bodom   Спасибо большое еще раз. Вроде пашет.ну при опреде…   22.12.2007 21:42


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 6.05.2024 3:00
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name