Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C] [Найти слово]


Автор: Revan 7.6.2009, 21:32
Дан текстовый файл. Определить, сколько раз встречается в нем заданное пользователем слово. Вывести на экран номера строк, где это слово найдено (программа должна находить слово независимо от регистра, на котором это слово набрано).

Автор: Dov 8.6.2009, 11:03
Код
int main()
{
    FILE * f;
    char   buf[81];
    char   word[21];
    char * p;
    int    count = 0;
    int    line  = 0;

    f = fopen( "file.txt", "r" );
    if( f == NULL )
    {
        puts( "..." );
        exit( 1 );
    }

    printf( "Enter word: " );
    gets( word );

    cout << "lines: ";
    while( !feof( f ) )
    {
        line++;
        fgets( buf, 81, f );

        if( p = strstr( strlwr( buf ), strlwr( word ) ) )
        {
            cout << line << ' ';
            count++;            
            while( ++p = strstr( p, word ) )
                count++;                
        }
    }
    fclose( f );

    if( !count )
        cout << 0;
    cout << "\ntotal: " << count << endl;

    return 0;
}

Автор: Revan 8.6.2009, 15:50
А можно на чистом Си переделать...спасибо

Автор: azesmcar 8.6.2009, 15:50
cout замени на printf, будет чистый Си.

Автор: Revan 8.6.2009, 16:03
Я так и сделал...но при компиляции программа выдаёт массу ошибок...

Автор: Dov 8.6.2009, 17:19
Код
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    FILE * f;
    char   buf[81];
    char   word[21];
    char * p;
    int    count = 0;
    int    line  = 0;

    f = fopen( "file.txt", "r" );
    if( f == NULL )
    {
        puts( "..." );
        exit( 1 );
    }

    printf( "Enter word: " );
    gets( word );

    printf( "lines: " );
    while( !feof( f ) )
    {
        line++;
        fgets( buf, 81, f );

        if( p = strstr( strlwr( buf ), strlwr( word ) ) )
        {
            printf( "%d ", line );
            count++;            
            while( ++p = strstr( p, word ) )
                count++;                
        }
    }
    fclose( f );

    if( !count )
        putchar( '0' );
    printf( "\ntotal: %d\n", count );

    return 0;
}


Какие ошибки выдаёт? Выкладывай.


Автор: Revan 8.6.2009, 21:08
В CodeBlocks всё нормально работает...а в Borland C++  3.1 не хочет запускаться...

Автор: zim22 9.6.2009, 08:24
Цитата(Revan @  8.6.2009,  16:03 Найти цитируемый пост)
но при компиляции программа выдаёт массу ошибок...

Цитата(Revan @  8.6.2009,  21:08 Найти цитируемый пост)
а в Borland C++  3.1 не хочет запускаться...

так вы определитесь: программа не запускается или при компиляции ошибки выдаёт?
*ошибки нам приводить не надо - мы телепаты, сами догадаемся, угу

Автор: Revan 9.6.2009, 14:27
Программа в борланде никак не хочет запускаться...

Автор: andrew_121 9.6.2009, 20:50
Revan, Читай выше!

Автор: Soah 9.6.2009, 22:27
Цитата(zim22 @  9.6.2009,  08:24 Найти цитируемый пост)
мы телепаты, сами догадаемся, угу

неужто не догадался?  smile 


Revan, функция http://www.realcoding.net/article/view/6479, о чём-нибудь говорит?

Автор: Revan 9.6.2009, 22:47
Но уж я не такой балбес....говорит..толку от  неё нет

Автор: Soah 9.6.2009, 22:57
Цитата(Revan @  9.6.2009,  22:47 Найти цитируемый пост)
толку от  неё нет

Код

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>

int main()
{
    FILE * f;
    char   buf[81];
    char   word[21];
    char * p;
    int    count = 0;
    int    line  = 0;

    f = fopen( "file.txt", "r" );
    if( f == NULL )
    {
        puts( "error" );
        getch();
        exit( 1 );
    }

    printf( "Enter word: " );
    gets( word );

    printf( "lines: " );
    while( !feof( f ) )
    {
        line++;
        fgets( buf, 81, f );

        if( p = strstr( strlwr( buf ), strlwr( word ) ) )
        {
            printf( "%d ", line );
            count++;            
            while( ++p = strstr( p, word ) )
                count++;                
        }
    }
    fclose( f );

    if( !count )
        putchar( '0' );
    printf( "\ntotal: %d\n", count );

    getch();
    return 0;

}

а так ?

Автор: Revan 9.6.2009, 23:15
При компиляции и запуске выводит ERROR

Автор: Soah 9.6.2009, 23:21
Цитата(Revan @  9.6.2009,  23:15 Найти цитируемый пост)
При компиляции и запуске выводит ERROR

http://c2p.ru/c/fopen.html
Цитата

Если функция fopen() успешно открыла заданный файл, она возвращает указатель FILE. Если файл открыть не удается, возвращается нулевой указатель.

Автор: Revan 9.6.2009, 23:27
Не понимаю  дабавили только одну команду и подключили библиотеку...борланд выдаёт Error...CodeBlocks всё ок...

Автор: Soah 9.6.2009, 23:32
Revan, в какой папке находится файл?
или скопируйте в ту папку, в которой создаётся exe, либо укажите полный путь.

Автор: Revan 9.6.2009, 23:39
Странно...компилируется правильно...но сама программа чего то мудит...откуда ошибка...

Автор: Soah 9.6.2009, 23:41
Revan, вы мои сообщение игнорируете?
http://c2p.ru/c/fopen.html
Цитата

Если функция fopen() успешно открыла заданный файл, она возвращает указатель FILE. Если файл открыть не удается, возвращается нулевой указатель.

Автор: Revan 9.6.2009, 23:47
Извините....не игнорировал...всё почти работает...после того как вожу слово...показывает только одну строчку...и зависает...и нее проходит на общую сумму этих слов...

Автор: Soah 10.6.2009, 00:04
Цитата(Revan @  9.6.2009,  23:47 Найти цитируемый пост)
показывает только одну строчку...и зависает

проверьте ещё раз файл,
пройдитесь пошагово по коду.

Автор: Revan 10.6.2009, 00:41
Вывод программы:

Enter word: aaa
lines: 1

Сам файл: 

aaa
bbb
ccc
aaa
ddd
eee
aaa

Зависает и не выполняется дальше условие...

Автор: Dov 10.6.2009, 01:11
Цитата(Revan @  10.6.2009,  00:41 Найти цитируемый пост)
Зависает и не выполняется дальше условие


Revan, скопируй сюда весь текст твоей проги, так как она счас выглядит... 

Автор: Revan 10.6.2009, 11:36
Код

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
int main()
{
    FILE * f;
    char   buf[81];
    char   word[21];
    char * p;
    int    count = 0;
    int    line  = 0;
    f = fopen( "file.txt", "r" );
    if( f == NULL )
    {
        puts( "error" );
        getch();
        exit( 1 );
    }
    printf( "Enter word: " );
    gets( word );
    printf( "lines: " );
    while( !feof( f ) )
    {
        line++;
        fgets( buf, 81, f );
        if( p = strstr( strlwr( buf ), strlwr( word ) ) )
        {
            printf( "%d ", line );
            count++;            
            while( ++p = strstr( p, word ) )
                count++;                
        }
    }
    fclose( f );
    if( !count )
        putchar( '0' );
    printf( "\ntotal: %d\n", count );
    getch();
    return 0;
}

Автор: Dov 10.6.2009, 18:47
Revan, проверил, у меня всё работает. Даже не знаю, что сказать. Правда, у меня VC++. 
А какие ошибки выдаёт? Выкладывай здесь, посмотрим. 

Автор: azesmcar 10.6.2009, 19:09
Dov

Код

while( ++p = strstr( p, word ) )

ошибка скорее всего тут, сильно не вдаюсь в код, но это вроде аналогичная замена.
Код

while( p = strstr( ++p, word ) )


Автор: Revan 10.6.2009, 20:30
Всё спасибо...теперь всё идёт...благодарю...

Автор: Dov 10.6.2009, 23:02
Цитата(azesmcar @  10.6.2009,  19:09 Найти цитируемый пост)
Dov ошибка скорее всего тут...

Да уж...  smile 

Вобще-то, если файл имеет такой формат:
Цитата(Revan @  10.6.2009,  00:41 Найти цитируемый пост)

Сам файл:
aaa
bbb
ccc
aaa
ddd
eee
aaa

то эти строки :
Код

while( ++p = strstr( p, word ) )
    count++;

можно смело удалить совсем.   smile  

Автор: Dov 10.6.2009, 23:35
Цитата(Dov @  10.6.2009,  23:02 Найти цитируемый пост)
Вобще-то, если файл имеет такой формат:

то вся программа может выглядеть так:
Код
#define SZ 21

int main()
{
    FILE *f;
    char  buff[SZ];
    char  word[SZ];
    int   count, line;

    printf( "Enter word: " );
    gets  ( word );
    printf( "lines: " );
    
    if( ( f = fopen( "file.txt", "r" ) ) == NULL )
        exit( 1 );

    for( line = 1, count = 0; fgets( buff, SZ, f ); line++ )
        if( !strnicmp( buff, word, strlen( word ) ) )
            printf( "%d ", line ),    count++;
    fclose( f );

    if( !count )
        putchar( '0' );
    printf( "\ntotal: %d\n", count );
    return 0;
}


Автор: Revan 10.6.2009, 23:59
Проверил код...очень много ошибок в борланде...профильтруйте сами через борланд

Автор: Dov 11.6.2009, 00:03
Revan, ты сюда ошибки компилятора выкладывай. Нету у меня борланда, а мысли на расстоянии я читать не умею..

Автор: Soah 11.6.2009, 00:08
Revan, что такое http://ru.wikipedia.org/wiki/Заголовочный_файл и для чего они нужны, знаете?

Про функцию getch() не забудьте.

Автор: azesmcar 11.6.2009, 00:08
Цитата(Revan @  10.6.2009,  23:59 Найти цитируемый пост)
Проверил код...очень много ошибок в борланде...профильтруйте сами через борланд 

борланд - не самый популярный компилятор. Зачастую он даже отказывается компилировать код, который должен проглотить без ошибок. Это даже не вина разработчиков борланд, это вина преподавателей которые заставляют писать на борланде. Этому дедушке уже очень много лет, я уж не говорю о том что даже от Borland C++ Builder сам производитель отказался, а про 3.1 который сейчас во всех институтах используют - и подавно молчу. Такие вот дела...побольше информации smile 

Автор: Revan 11.6.2009, 00:43
Всё получилось...ещё хотел  спросить ввожу   \   ...выводит все строки...как будто этот символ единственный в файле во всех строчках...Что такое? И я не понял строку 
Код

#define SZ 21

Автор: zim22 11.6.2009, 07:56
Цитата(Revan @  11.6.2009,  00:43 Найти цитируемый пост)
.Что такое? И я не понял строку 

бывает. я тоже много чего не понимаю.
***
до компиляции исходника по нему пройдётся препроцессор и заменит все  SZ на число 21.

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