Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> написал программу FILE и т.д, не работает! 
V
    Опции темы
apook
Дата 4.1.2007, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



ажет ли мне кто нибудь почему программа не работает как надо,
а то я запарился уже компелировать.

 Программа для замены в текстовом файле

На bcc32 компелирую:
    прога работает, но ...
    1. если я увеличиваю слово "на которое меняю" то программа нач
    инает работать через раз(точнее просто зависает),  причем  чем
    дли нее слово "на которое меняю" тем меньше шансов что все про
    йдет как надо, но даже при вылете можно обнаружить что  задача
    выполнена.
    2. Смотри пункт 1

На tсс компелирую:
    прога не работает, но ...
    1. Тот-раз работала. не помню че сделал что перестала.
    2. Она все-же коипилируется без ошибок но звисает сразу
    3. Убрав из кода все(именнно все) free( );  прога  выполнялась
    но в конце было сообщение что-то там  Null Pointer Assignment,
    но опять-же больше не повторяется
   
Я подозреваю malloc realloc особенно второй но не в курсе что  там
за нюансы, да и по мелочи какие-то косячки
Код
 
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
#include "string.h"


long *fcalc( FILE *f )
{
char ch;
long i, j, c, *x;
x=( long * ) malloc ( 2 );
x[0]=0;
x[1]=0;
fseek( f, 0, SEEK_SET );

for( i=0, j=0, c=0; ; i++ )
{
    ch =fgetc( f );
    if( ch =='\n' || ch ==EOF || ch =='\0' )
    {
        if( i >c ) c =i;
        if( ch==EOF && i==0 ) break;
        j++;
        i=0;
        }
    if( ch==EOF ) break;
    }

x[0]=j; /*количество строк */
x[1]=c; /*длина самой длинной строки*/
return x;
}


long *finds( char *str1, char *str2 )
{
const int len1=strlen(str1), len2=strlen(str2);
int i=0, j=0, wi=0, ex=0, r=-1;
long *y;
y =( long *  ) malloc ( 2 );

y[0] =-1;
y[1] =-1;

if( len1 >=len2 )
{
    for( i=0; i <len1; i++ )
    {
        wi =i;
        while( j <len2 )
        {
            if( str1[wi] ==str2[j] )
            {
                if( r <0 ) r = wi;

                if( j == (len2 -1) )
                {
                    ex =1;
                    break;
                    }

                j++;
                wi++;
                }
           else
           {
                r =-1;
                j =0;  
                break; 
                }
            }
         if( ex==1 ) break;
         }
    y[0] =r;
    y[1] =wi;
    }
return y; // Возвращает первое и последнее вхождение
}


void main()
{
long *x, *y;
int i=0, j=0, c=0, q=0, p=0;
char s[50], t[50], fname_in[50], fname_out[50], *str=NULL, *Temp=NULL;
FILE *f, *fd;

x=( long * ) malloc ( 2 );
y=( long * ) malloc ( 2 );


strcpy( fname_in, "Text.txt" );
strcpy( fname_out, "Text.$$$" );

strcpy( s, "abc"  ); // <-- Заменять сочетание 'abc'
strcpy( t, "Hello!"  ); // --> на сочетание 'Hello!'

if( (f=(fopen( fname_in, "r" ))) !=NULL );
else
{
    perror( "Error reading \n");
    exit(1);
    }

if( (fd=(fopen( fname_out, "w+" ))) !=NULL );
else
{
    perror( "Error reading \n");
    exit(1);
    }
    
y =fcalc( f );    
if( y[0] ==0 )
{
    printf( "File Length of zero: %s", fname_in );
    exit(1);
    }    

//Память под переменные ...
if( (str = (char *) malloc(y[1]-strlen(s)+strlen(t))) == NULL)
{
    printf("Not enough memory to allocate buffer\n");
    exit(1);  /* terminate program if out of memory */
    }

if( (Temp = (char *) malloc (y[1]-strlen(s)+strlen(t))) == NULL)
{
    printf("Not enough memory to allocate buffer\n");
    exit(1);  /* terminate program if out of memory */
    }
//..

fseek( f, 0, SEEK_SET );
// ------------------------
for( p=0, y[1]++; !feof( f ); p++  )
{
    fgets( str, y[1], f );

    for( ; ;)
    {
        x=finds( str, s );

    if( x[0] ==-1 || x[1] ==-1 ) break;
        else 
    {
            /* Если удалить этот участок то программа будет заменять все встреченные сочетания
               символов заданные в строке s на символы заданные в строке t, а не слово s на сл
               ово t  
            
            if( (x[0] ==0) && ((str[x[1]+1] ==' ') || (str[x[1]+1] =='\n') || (str[x[1]+1] =='\0')) );
            else if( ((str[x[0]-1] ==' ') || (str[x[0]-1] =='\t')) && ((str[x[1]+1] ==' ') || (str[x[1]+1] =='\n')
            || (str[x[1]+1] =='\0')) );
            else break;
            // ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^       
*/
            if( (Temp = (char *) realloc (Temp, strlen(str)-strlen(s)+strlen(t)+1)) == NULL )
            {
                 printf("Not enough memory to allocate buffer\n");
                 exit(1);
                 }
            for( i=0, c=0; i <x[0]; i++, c++ )
                 Temp[i]=str[c];

            for( j=0; (unsigned)j <strlen(t); j++, i++ )
                 Temp[i]=t[j];

            for( c+=strlen(s); (unsigned)c <strlen(str); i++, c++ )
                 Temp[i]=str[c];
            Temp[i] ='\0';

            str = ( char * ) realloc ( str, strlen(Temp)+1 );

            if( (str = (char *) realloc (str, strlen(Temp)+1)) == NULL )
            {
                 printf("Not enough memory to allocate buffer\n");
                 exit(1);
                 }
            memset( str, NULL, strlen(str) );
        strcpy( str, Temp );
            memset( Temp, NULL, strlen(Temp) );
            }
        }
    fprintf( fd, "%s", str );
    memset( str, NULL, strlen(str) );
    }
// ------------------------


free( Temp );
free( str );

fclose( f );
fclose( fd );

if( remove(fname_in) != 0 )
    perror("remve");

if( rename(fname_out, fname_in) != 0 )
    perror("rename");


free( y );
free( x );
return;
}




--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
_hunter
Дата 4.1.2007, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



ну так берем отладчик и вдумчиво проходим по коду. операцию (в случае необходимости) повторить...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
apook
Дата 4.1.2007, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



Если честно не умею пользоваться отладчиком,ведь я недавно программирую
и чисто для себя... Вообще просто  пошагово прохжу , с  остановками, по
коду (миниотладка). Null Pointer Assignment меня уже не первый  раз одо
левает. Пустой указатель. Причем загадочные причины.


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Kuvaldis
Дата 4.1.2007, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 11
Всего: 61



apook
Код

x=( long * ) malloc ( 2 );

ИМХО, нужно так:
Код

x=( long * ) malloc ( 2 * sizeof(long) );

ты ж выделяешь память только под 2 байта и потом работаешь с памятью под long, которая не была выделена...


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
_hunter
Дата 4.1.2007, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



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


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
apook
Дата 4.1.2007, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



поменял
x=( long * ) malloc ( 2 );
на
x=( long * ) malloc ( 2 * sizeof(long) );
комиле ин БСС32 и не мог нарадоваться как все работает, пока не
компилировал в tcc там все как раньше.
Так значит надо и str=( char * ) malloc ( 100 * sizeof(char) )
поменять что-ли. В примерах  пишут str=( char * ) malloc ( 20 )
из того-же нелпа?

С дебаггингом напряг, я вообще не  смог его запустить. Запускаю
всякие watch -и а там что-то вроде process not in  assemble это
в Buildere где там кнопка на которой написано Debug блин.


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
JackYF
Дата 4.1.2007, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(apook @  4.1.2007,  18:08 Найти цитируемый пост)
С дебаггингом напряг, я вообще не  смог его запустить. Запускаю
всякие watch -и а там что-то вроде process not in  assemble это
в Buildere где там кнопка на которой написано Debug блин.



Дык а в это время ты прогу пошагово запустил?



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Kuvaldis
Дата 4.1.2007, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 11
Всего: 61



apook
тискаем кнопку F8... и будет тебе счастье... (пошаговая трассировка)
а вообще  на  наличие ошибок и проверку логики лучше всего отвечает компиляция в Visual Studio smile 


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
apook
Дата 4.1.2007, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



сейчас подставил и sizeof(char) заработало и в Turbo
благодарю Kuvaldis -а

Пошагово громко сказано
просто getch(); а перед этим printf( переменная )



--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1284 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.