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

> Внимание!

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

> Удалить из текста символ!
Child of Bodom
сообщение 18.12.2007 10:03
Сообщение #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 - 18.12.2007 14:07
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 21.12.2007 12:57
Сообщение #2


Гость






А теперь расскажи, что ИМЕННО ты вводишь? У тебя в конце каждой строки что расположено? Перевод строки? Что же ты хотел? Я тебе для чего в самом начале говорил делать это через поток ifstream + метод getline? Потому что этот метод читает всю строку, не включая символ перевода строки. Ты переделал по-своему, теперь ищи в buffer-е после прочтения символ '\n' и выкидывай его из буфера (т.е., заменяй символом '\0'). Тогда получишь в результате обработки файла

    na pole tanki grohotali_
soldaty shli v posledniy boy_
a molodogo komandira_
nesli s probitoi golovoy_
вот такой результат в Memo:
4,2na1,4pole1,5tanki1,9grohotali
4,7soldaty1,4shli1,1v1,9posledniy3,3boy
3,1a1,8molodogo1,9komandira
7,5nesli1,1s1,8probitoi1,7golovoy
(пробелы в конце строки будут тоже выброшены из рассмотрения, при обратной конвертации надо будет добавить в конец строки еще один пробел) или переписывай алгоритм с нуля... Я больше с FILE* (при использовании C++ Builder-а) извращаться не буду. В С++ есть гораздо более подходящие для этого средства...


Добавлено через 19 мин.
Хотя, если я правильно понимаю, что именно должно получиться, попробуй вот это:
void __fastcall TForm1::Button6Click(TObject *Sender)
{
const int max_size = 256;
char buffer[max_size];

if(!vibor->Execute()) return;
FILE *input = fopen (vibor->FileName.c_str(),"rt");
FILE *output = fopen ("G:\\WWW4.txt", "wt");
AnsiString sym = Edit->Text;
char to_delete = sym[1];
int count;
while(!feof(input)) {
buffer[0] = '\0';
fgets(buffer,max_size,input);

AnsiString result = "";
for(char *p = buffer; (*p) && (*p != '\n'); p++) {
count = 0;

while(*p == to_delete) {
count += 1;
p++;
}
AnsiString after = "";
for(; *p && *p != '\n' && *p != to_delete; *p++) {
after += *p;
}
p -= 1;
result +=
IntToStr(count) + "," + IntToStr(after.Length()) + after;
}
fprintf(output, "%s\n", result.c_str());
}
fclose(input);
fclose(output);
Mem->Lines->LoadFromFile("G:\\WWW4.txt");

}

 К началу страницы 
+ Ответить 
Child of Bodom
сообщение 22.12.2007 17:42
Сообщение #3


Новичок
*

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

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


Спасибо большое еще раз. Вроде пашет.ну при определенных параметрах. может прокатит
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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


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

 



- Текстовая версия 24.07.2025 2:49
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"