Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Как удалить строку ???


Автор: I0207 1.2.2006, 18:43
Люди!!!! Поможите!!!! Как удалить строку из текстового файла??? киньте прогу кто может!!!! Файл наз-ся phone.txt . Как удалить строку с именем Игорь(например)???

Автор: _hunter 1.2.2006, 18:55
читаеш все строки из файла и пишеш их в другой файл. если строка равна "Игорь(например)" -- не пишеш ее в другой файл.
потом другой файл переименовываеш в "наз-ся phone.txt".
( простейший вариант без всякого подобия кеширования )

Автор: oper54 1.2.2006, 19:03
Или так сказать, с кешированием smile
В билдере знаю есть чудный класс TStringList (список AnsiString), а у него метод LoadFile(точно не помню), ну а дальше совсем просто, удаляешь елемент списка с в стоке которого есть имя Игорь(AnsiString дает возможность искать в строке подстроку), потом перезаписываешь файл

Автор: I0207 2.2.2006, 11:05
smile Hynter, а как это реализовать??? помоги с прогой, век помнить буду!!!
Добавлено @ 11:15
Oper 54, как это сделать??? Поможи а???? smile
А можно как нибудь через Консоль Визард распечатать txt файл??? а лучше то что начёрном экране.

Автор: _hunter 2.2.2006, 11:27
I0207, проги пишут не в этом разделе. тебе в раздел работа...
что такое " Консоль Визард"?

Автор: AntonChik 2.2.2006, 13:07
чел имеет ввиду File->New->Other->Console Wizard... удобная штука писать консольные приложения из-под Билдера... smile (блеснул умом)

Автор: Artemon 2.2.2006, 13:43

100% - рабочий код.

Код


TStringList * lst = new TStringList;

  if( !lst ) return;

  try         { lst->LoadFromFile("phone.txt"); }
  catch(...)  { return;                         }

  long int k;

  for( k = 0; k < lst->Count;  )
     {
     if( lst->Strings[k] == "123" ) { lst->Delete(k); continue; }
     k++;
     }

  try        { lst->SaveToFile("phone.txt"); }
  catch(...) {return;                        }

  if( lst ) delete lst;



Автор: I0207 2.2.2006, 15:56
Попробую, заранее спасибо, однако если не получится то попрошу помощи ещё!!! smile

Автор: I0207 2.2.2006, 16:58
smile вот зараза не выходит ни как смотри в чём и как дела:
#define FNAME "c:\\phone.txt\0"
char fname[20]=FNAME;
FILE *out;
char fam[15];
char name[15];
char tel[9];
if((out=fopen(fname,"rt")) == NULL) //вот я открыл его в режиме чтения а дальше как быть???
{
printf("erorr");
getch();
}

???????????????????????

fclose(out);

Автор: Artemon 2.2.2006, 17:39
Ты что на C перешел?

smile


Или ты на столько крут, что не хочешь пользоваться приведенным ранее кодом (причем рабочим) ?

Автор: I0207 2.2.2006, 19:05
smile да не получется у меня им воспользоваться, обьясни как и что куда надо дописывать????
Добавлено @ 19:09
просто там я привел то что ранее было создано, а теперь просто к тому надо дописать удаление!!! Извиняюсь конечно за свою тупость,ну разъясни а??!!!??
Добавлено @ 19:15
Да если что я всё делаю в С++ Builder Console Wizard

Автор: I0207 2.2.2006, 21:09
Не получается у меня им воспользоваться, обьясни как что и куда надо дописывать???

Автор: Partizan 3.2.2006, 01:37
просто при создании консольного проекта надо подключить файл с объявлением класса TStringList smile

Автор: I0207 3.2.2006, 07:50
А как это сделать??? В начале программы написать #include<TStringList>??? Или как иначе ???

Автор: Artemon 3.2.2006, 08:19
Ладно так уж и быть.............

1) Забудь про cвою консоль.
2) Открыть C++Builder
3) File->New->Application;
4) С панели Standart перенеси кнопку (button) на форму.
5) Два раза щелкни мышью по кнопке - появится участок кода, в который нужно вставить приведенный ранее мной код.
6) File->Save.
7) В каиалоге, в котром сохранил программу создай свой любимый файл phone.txt
8) Пользуйся.


P.S.
Мне почему-то кажется что ты пишешь не в C++Builder а в turbo C.
Если это так - ты просто скажи, потому что решение будет совсем другим, мало того, код C++Builder в turbo C работать не будет.

Автор: I0207 3.2.2006, 09:47
smile Огромное конечно спасибо, но нужно все сделать ч/з Consol Wizard -> поставить галочку напротив Си++ и прописывать всё в ручную, мне и в Turbo C пригодилось ды решение, так что прошу ПОМОЩИ!!!

Автор: Artemon 3.2.2006, 10:07
Код


//---------------------------------------------------------------------------

#include <vcl.h>
#include <conio.h>
#include <stdio.h>

#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused

  bool LoadFileAndDelStr(AnsiString Fname, AnsiString Str);

  int main(int argc, char* argv[])
{
  if( !LoadFileAndDelStr("phone.txt", "Igor") )
    printf("\nError!!!");
  else
    printf("\nOK!!!");

  getch();

  return 0;
}
//---------------------------------------------------------------------------
  bool LoadFileAndDelStr(AnsiString Fname, AnsiString Str)
{

  TStringList * lst = new TStringList;

  if( !lst ) return false;

  try         { lst->LoadFromFile(Fname); }
  catch(...)  { return false;                   }

  long int k;

  for( k = 0; k < lst->Count;  )
     {
     if( lst->Strings[k] == Str ) { lst->Delete(k); continue; }
     k++;
     }

  try        { lst->SaveToFile(Fname); }
  catch(...) {return false;            }

  if( lst ) delete lst;

  return true;
}
//---------------------------------------------------------------------------



P.S.
В Turbo C этот код использовать нельзя.

Готовая программа.

Автор: I0207 3.2.2006, 13:19
smile Огомнейшее спасибо вроде по тихоньку получается, однако тема не закрыта, если что не выйдет я накалякую что-нибудь ещё!!! Ах, да а как этот файл вытащить на печать???

Автор: _hunter 3.2.2006, 13:27
"на печать" это на принтер или в консоль?

Автор: I0207 3.2.2006, 14:03
Удаляется та строка на которой только слово Igor, а мне желательно удалить строку в которой "Yunusov Igor" при этом введя с клавиатуры "Yunusov" Как такое сделать???(моя последняя просьба)
Добавлено @ 14:04
smile На печать на принтер

Автор: _hunter 3.2.2006, 14:47
зависит от среды.
в Билдере у класса AnsiString есть метод Pos()
в С функция strstr()

Автор: I0207 3.2.2006, 15:06
и что??? допустим у меня файл phone. txt как его распечатать???
Добавлено @ 15:07
Artemon!!! прочти пожалуйста после своего кода ОЧЕНЬ ВАЖНО!!!

Автор: _hunter 3.2.2006, 15:48
скопируй его в файл с именем LPT1

Автор: I0207 3.2.2006, 21:52
Artemon посмотри Please!!!! посмотри после своей программы которую ты здесь написал!!!!

Автор: Artemon 4.2.2006, 15:14
Замени строку

Код

if( lst->Strings[k] == Str ) { lst->Delete(k); continue; }


на

Код

if( lst->Strings[k].Pos(Str) ) { lst->Delete(k); continue; }




После этого изменения - программу будет удалять строки, в которых найдет заданную подстроку.


Автор: I0207 5.2.2006, 12:39
smile ARTEMON, ты супер мозг!!!!Круто всё работает, однако ещё одно пожелание есть, как сделать так чтобы Параметр удаления вводился с клавиатуры????

Автор: Artemon 6.2.2006, 08:42
Добавь в начало main следующий код:

Код

char mas[1000]="";
printf("\nInput text: ");
scanf("%s", mas);


замени строку
Код

if( !LoadFileAndDelStr("phone.txt", "Igor") )


на

Код

if( !LoadFileAndDelStr("phone.txt", (AnsiString)mas)  )


Автор: I0207 6.2.2006, 16:42
smile Artemon, спасибо тебе огромное, не знаю что бы я без твоей помощи делал, КАК ХОРОШО ЧТО НА СВЕТЕ ЕСТЬ ТАКИЕ ЛЮДИ!!!(ЛЮДИЩА!!!!)
Спасибо всем, тема закрыта!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)