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


Автор: NimbJles 17.5.2015, 13:20
Написать программу, которая считывает текст из файла и выводит на экран только предложения, содержащие введенное с клавиатуры слово.
Код

#include "stdafx.h"
#include "conio.h"
#include "locale.h"
#include "stdio.h"
#include "string.h"
using namespace System;

int main(array<System::String ^> ^args)
{
    setlocale(LC_ALL, "Russian");
    FILE *fp;
    char c;
    char fname[20];
    char slovo[20];
    bool flag;
    puts("Введите имя файла: \n");
    gets_s(fname);
    if ((fp = fopen(fname, "r")) == NULL)
    {
        perror(fname);
        return 1;
    }
    puts("Файл открыт на чтение. В нём содержиться следующий текст: \n");
    while ((c = getc(fp)) != EOF)
        putchar(c);
    printf("\nВведите искомое слово: ");
    scanf_s("%s", slovo, 20);
    do { 
        c = getc(fp);
        if (c == slovo[20])
            putchar(c);
    } while (c != EOF);
    fclose(fp);
    _getch();
    return 0;

Считывание я сделал, а вот вывести предложения с искомым мне словом у меня не получается. Помогите пожалуйста.

Автор: rudolfninja 19.5.2015, 10:09
Считываете в буффер символы до тех пор, пока не дойдете до точки (восклицательного знака или знака вопроса). Затем проверяетя этот буфер на наличие нужного слова c помощью функции http://www.cplusplus.com/reference/cstring/strstr/

Автор: NimbJles 22.5.2015, 23:34
Код

#include "stdafx.h"
#include "conio.h"
#include "locale.h"
#include "stdio.h"
#include "string.h"
#include "malloc.h"

enum { BUFFER_SIZE = 10 };
using namespace System;

int main(array<System::String ^> ^args)
{
    setlocale(LC_ALL, "Russian");
    char* buffer = (char*)malloc(BUFFER_SIZE * sizeof(char));
    unsigned short sz = BUFFER_SIZE, i = 0;
    FILE *fp;
    char c;
    char fname[20];
    char slovo[20];
    puts("Введите имя файла: \n");
    gets_s(fname);
    if ((fp = fopen(fname, "r")) == NULL)
    {
        perror(fname);
        return 1;
    }
    puts("Файл открыт на чтение. В нём содержиться следующий текст: \n");
    while ((c = getc(fp)) != EOF)
        putchar(c);
    printf("\nВведите искомое слово: ");
    scanf_s("%s", slovo, 20);
    char valid = 1;
    do {
        c = getc(fp);
        if (c == '.' || c == '?' || c == '!' || c == EOF)
        {
            if (valid)
            {
                fwrite(buffer, sizeof(char), i, stdout);
                putchar(c);
            }
            else valid = 1;
            i = 0;
        }
         if (valid)
         if (c == slovo[20])
            valid = 1;
        else{
            buffer[i++] = c;
            if (i == sz)
                buffer = (char*)realloc(buffer, (sz += BUFFER_SIZE) * sizeof(char));
        }
    }
    while (c != EOF);
    free(buffer);
    fclose(fp);
    _getch();
    return 0;
}

Так я и не понял как это правильно реализовать(, можете написать код?

Автор: rudolfninja 25.5.2015, 13:24
Код

char sent[256];
do {
        c = getc(fp);
        while (c != '.' || c != '?' || c != '!' || c != EOF)
        {
            strcat(sent, c);
        }
        // теперь в sent находится полное предложение
        if(strstr(sent, slovo) != NULL)
            printf("%s", sent);
    }
    while (c != EOF);

Вот примерно так. Код писал сразу тут, без проверки, но должно работать.
Еще хорошо бы сделать проверку, чтоб найденная часть была словом, а не "подсловом". То есть, если вы ищите слово "кот", а в предложении есть слово "байкот", то это предложение будет выведено.
Можете добавить проверку, чтоб перед словом стоял либо пробел, либо это слово было началом строки (предполагается, что после знака препинания перед новым словом ставится пробел), а после слова был либо пробел, либо нужный знак препинания (запятая, точка, двоеточие, восклицательный/вопросительный знак) или слово было последним в строке. 
Прочитайте про функцию strstr и strlen и поймете как это реализовать.

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