Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.05.2009, 02:34   #31
Nitrino
Я ещё только учусь
Форумчанин
 
Регистрация: 06.05.2009
Сообщений: 158
По умолчанию

Вот функция вставляющая строку в начало файла
Код:
node* insert_first(node *nsp)
{
  clrscr();
  int i,k;
  node *rsp;
  char strok[1000];
  FILE *fp;
  textbackground( TEXT_BG ); textcolor( TEXT_C );
  clrscr();
  cprintf("Введите строку:\n\r");
  gets(strok);
  rsp=(node*) malloc (sizeof(node));
  strcpy(rsp->str, strok);
  rsp->sled = nsp;
  nsp = rsp;
  fp = fopen("1.txt", "w+t");
  fseek(fp,0,SEEK_SET);
  while  (rsp!=NULL)
  {
   fputs(rsp->str, fp); rsp = rsp->sled;
  }
  fclose(fp);
  fp = fopen("1.txt", "r+t");
  k=strlen(strok);
  fseek(fp,k,SEEK_SET);
  fprintf(fp ,"\n");
  fclose(fp);
  clrscr();
  textbackground( TEXT_BG ); textcolor( TEXT_C );
   clrscr(); gotoxy( COL, ROW-1 );
   i=1; while( i <= K ) { out_menu2( i, TEXT_BG ); i++; }
  return nsp;
}
Не могу понять почему после этой строки дописываются непонятные символы
Nitrino вне форума Ответить с цитированием
Старый 30.05.2009, 03:26   #32
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Я так понимаю, что в функцию передается уже существующий список строк. Так?
Попробуйте после копирования:
Код:
strcpy(rsp->str, strok);
добавить
Код:
strcat(rsp->str,'\0');
или
Код:
rsp->str[strlen(strok)] = 0;
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 30.05.2009, 15:46   #33
Nitrino
Я ещё только учусь
Форумчанин
 
Регистрация: 06.05.2009
Сообщений: 158
По умолчанию

не не помогает всё равно дописывает всякий мусор причём пишет не вставляемую строку, а строкой ниже.
Пример: в файле была строка Hello world хочу добавить первой строкой HI, Вот результат
Код:
hi
|`ЁHello world
Вот полный текст программы
Код:
void out_file (node *nsp)
//Вывод содержимого двунаправленного списка.
{
  int i;
  node *rsp;
  rsp = (*nsp).sled;
  textbackground( TEXT_BG ); textcolor( TEXT_C );
  clrscr();
  while  (rsp!=NULL)
  {
   cprintf("\r %s", rsp->str); rsp = rsp->sled;
  }
  getch();
  clrscr();
  textbackground( TEXT_BG ); textcolor( TEXT_C );
   clrscr(); gotoxy( COL, ROW-1 );
   i=1; while( i <= N ) { out_menu( i, TEXT_BG ); i++; }
}
//----------------------------------------------------------------
//Вставка строки в начало файла
node* insert_first(node *nsp)
{
  clrscr();
  int i,k;
  node *rsp;
  char strok[1000];
  FILE *fp;
  textbackground( TEXT_BG ); textcolor( TEXT_C );
  clrscr();
  cprintf("Введите строку:\n\r");
  gets(strok);
  rsp=(node*) malloc (sizeof(node));
  strcpy(rsp->str, strok);
  strcat(rsp->str, "\0");
  rsp->sled = nsp;
  nsp = rsp;
  fp = fopen("1.txt", "w+t");
  fseek(fp,0,SEEK_SET);
  while  (rsp!=NULL)
  {
   fputs(rsp->str, fp); rsp = rsp->sled;
  }
  fclose(fp);
  fp = fopen("1.txt", "r+t");
  k=strlen(strok);
  fseek(fp,k,SEEK_SET);
  fprintf(fp ,"\n");
  fclose(fp);
  clrscr();
  textbackground( TEXT_BG ); textcolor( TEXT_C );
   clrscr(); gotoxy( COL, ROW-1 );
   i=1; while( i <= K ) { out_menu2( i, TEXT_BG ); i++; }
  return nsp;
}


//Вставка строки в файл
void new_str(node *nsp)
{
   clrscr();
   int loop;
   int choice;
   int old_choice;
   double fun, x;
   int i;
   textbackground( TEXT_BG ); textcolor( TEXT_C );
   clrscr(); gotoxy( COL, ROW-1 );
   /* Начальный вывод всех пунктов меню */
   i=1; while( i <= N ) { out_menu2( i, TEXT_BG ); i++; }
   loop = 1; choice = 1; old_choice = 2;
   while ( loop )
   {
      out_menu2( old_choice, TEXT_BG );
      out_menu2( choice, CHOICE_BG );
      old_choice = choice;
      switch( GetCh() )
      {
	 case kbUp    :
	    if ( choice>1 ) choice--; else choice = N; break;
	 case kbDown  :
	    if ( choice<N ) choice++; else choice = 1; break;
	 case kbEnter :
	    switch ( choice )
	    {
	       case 1 : nsp=insert_first(nsp);	     ; break;
	       case 2 :           		     ; break;
	       case 3 :           		     ; break;
	       case 4 : loop=0; textbackground( TEXT_BG );
	       textcolor( TEXT_C ); clrscr(); gotoxy( COL, ROW-1 );
	       i=1; while( i <= N ) { out_menu( i, TEXT_BG ); i++; } break;
	    }
	    textbackground( TEXT_BG ); gotoxy( COL-5, ROW+6 );

      }
   }
}


/* Организация светового меню */
void main ( void )
{
   clrscr();
   node *nsp, *ksp;
   int loop;        /* Флаг конца работы            */
   int choice;      /* Текущий выбор пункта меню    */
   int old_choice;  /* Старый выбор пункта меню     */
   double fun, x;   /* Значения функции и аргумента */
   int i;
   textbackground( TEXT_BG ); textcolor( TEXT_C );
   clrscr(); gotoxy( COL, ROW-1 );
   /* Начальный вывод всех пунктов меню */
   i=1; while( i <= N ) { out_menu( i, TEXT_BG ); i++; }
   loop = 1; choice = 1; old_choice = 2;
   while ( loop )
   {
      out_menu( old_choice, TEXT_BG );
      out_menu( choice, CHOICE_BG );
      old_choice = choice;
      switch( GetCh() )
      {
	 case kbUp    :
	    if ( choice>1 ) choice--; else choice = N; break;
	 case kbDown  :
	    if ( choice<N ) choice++; else choice = 1; break;
	 case kbEnter :
	    switch ( choice )
	    {
	       case 1 : open_file (&nsp, &ksp)    ; break;
	       case 2 : out_file (nsp)            ; break;
	       case 3 : new_str(nsp)                 ; break;
	      // case 4 :           ; break;
	       case 5 : loop=0;     continue;
	    }
	    textbackground( TEXT_BG ); gotoxy( COL-5, ROW+6 );

      }
   }
}

/* Функция вывода строки меню с указанным цветом фона */
void out_menu( int num, int bg_color )
{
   textbackground( bg_color ); gotoxy( COL, ROW+num );
   switch( num )
   {
      case 1: cprintf( "1. Открыть файл      " );  break;
      case 2: cprintf( "2. Просмотр файла    " );  break;
      case 3: cprintf( "3. Добавление строки " );  break;
     // case 4: cprintf( "4. Удаление строки   " );  break;
      case 5: cprintf( "5. Конец работы      " );  break;
   }
}
Nitrino вне форума Ответить с цитированием
Старый 30.05.2009, 16:16   #34
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Nitrino, что-то не хочет у меня компилиться ваша прога. Ругается на объявление структуры (Declaration syntax error), хотя все правильно.
Лучше прикрепите исходник.

Скажите, а до функции вставки в списке нет этих лишних символов? Может, проблема еще раньше появляется?
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 30.05.2009, 16:29   #35
Nitrino
Я ещё только учусь
Форумчанин
 
Регистрация: 06.05.2009
Сообщений: 158
По умолчанию

Да нет функция просмотра файла, выводящая содержимое списка на экран правильно работает, а после добавления ещё одного элемента спсика появляются лишнее символы вот исходник:
Вложения
Тип файла: rar BIN.rar (1.7 Кб, 9 просмотров)
Nitrino вне форума Ответить с цитированием
Старый 30.05.2009, 16:55   #36
Nitrino
Я ещё только учусь
Форумчанин
 
Регистрация: 06.05.2009
Сообщений: 158
По умолчанию

Могу выложить сам компилятор если нужно?
Nitrino вне форума Ответить с цитированием
Старый 30.05.2009, 17:12   #37
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Компилятор у меня есть (BC 3.1). Правда, он жутко неудобный. Но только в нем есть все необходимые файлы.

Вот, что выяснил.
в функции вывода
Код:
rsp = (*nsp).sled;
тут, наверное, должно быть
Код:
rsp = nsp;
-------
Теперь по проблеме:
Добавьте в начало функции insert_first вывод элемента nsp->str и вы увидите, что там уже содержится мусор (вместо первой строки файла).
Собственно, вот в эту сторону и нужно копать.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 30.05.2009, 18:25   #38
Nitrino
Я ещё только учусь
Форумчанин
 
Регистрация: 06.05.2009
Сообщений: 158
По умолчанию

смотрите я добавляю strcpy(nsp->str,'\0'); в начало функции что бы это место не было ничем заполненно
Код:
node* insert_first(node *nsp)
{
  clrscr();
  int i,k;
  node *rsp;
  char strok[1000];
  FILE *fp;
  //strcpy(nsp->str,'\0');
  cprintf("%s\n\r%s\n\r\n\r",nsp->str,nsp->sled->str);
  getch();
  textbackground( TEXT_BG ); textcolor( TEXT_C );
  clrscr();
  printf("%s",nsp->str);
  cprintf("Введите строку:\n\r");
  gets(strok);
  rsp=(node*) malloc (sizeof(node));
  strcpy(rsp->str, strok);
  rsp->sled = nsp;
  nsp = rsp;
  fp = fopen("1.txt", "w+t");
  fseek(fp,0,SEEK_SET);
  while  (rsp!=NULL)
  {
   fputs(rsp->str, fp); rsp = rsp->sled;
  }
  fclose(fp);
  fp = fopen("1.txt", "r+t");
  k=strlen(strok);
  fseek(fp,k,SEEK_SET);
  fprintf(fp ,"\n");
  fclose(fp);
  clrscr();
  textbackground( TEXT_BG ); textcolor( TEXT_C );
   clrscr(); gotoxy( COL, ROW-1 );
   i=1; while( i <= K ) { out_menu2( i, TEXT_BG ); i++; }
  return nsp;
}

Последний раз редактировалось Nitrino; 30.05.2009 в 18:48.
Nitrino вне форума Ответить с цитированием
Старый 30.05.2009, 18:33   #39
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от Nitrino
смотрите я добавляю strcpy(nsp->str,'\0'); в начало функции что бы это место не было ничем заполненно
Да нет же!
У вас в nsp->str вместо первой строки файла мусор!
То есть проблему нужно искать еще на стадии заполнения списка.
Добавьте в начало функции:
Код:
cprintf("%s\n\r%s\n\r\n\r",nsp->str,nsp->sled->str);
getch();
и увидите.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 30.05.2009, 18:46   #40
Nitrino
Я ещё только учусь
Форумчанин
 
Регистрация: 06.05.2009
Сообщений: 158
По умолчанию

Смотрите когда мы просматриваем файл функцией
Код:
void out_file (node *nsp)
//Вывод содержимого двунаправленного списка.
{
  int i;
  node *rsp;
  rsp = (*nsp).sled;
  textbackground( TEXT_BG ); textcolor( TEXT_C );
  clrscr();
  while  (rsp!=NULL)
  {
   cprintf("\r %s", rsp->str); rsp = rsp->sled;
  }
  getch();
  clrscr();
  textbackground( TEXT_BG ); textcolor( TEXT_C );
   clrscr(); gotoxy( COL, ROW-1 );
   i=1; while( i <= N ) { out_menu( i, TEXT_BG ); i++; }
}
Всё правильно выводится, значит же заполнение верно, может просто указатель nsp ссылает неверно?

Последний раз редактировалось Nitrino; 30.05.2009 в 18:48.
Nitrino вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Десятичные дроби в двоичном виде Ukrajinec Помощь студентам 2 13.04.2009 11:29
хранение данных в файле (dc++) AsabeasT Общие вопросы Delphi 2 27.03.2009 11:57
Поиск определённого текста в текстовом файле vitawt Общие вопросы Delphi 4 20.01.2008 22:12
Как правильно сохранить настройки текста в ini файле KORN Общие вопросы Delphi 2 30.10.2007 09:14
Поиск и замена текста в файле VAbramyak Общие вопросы Delphi 3 04.04.2007 20:20