Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.86/22: Рейтинг темы: голосов - 22, средняя оценка - 4.86
72 / 72 / 1
Регистрация: 02.08.2008
Сообщений: 107
1

Строки

02.08.2008, 15:08. Просмотров 4180. Ответов 24
Метки нет (Все метки)


Приветствую Вас, братья и сёстры. У меня возникла проблемка с простой задачкой из книжки госпожи Павловской. Вот она: написать программу, которая считывает текст из файла и выводит на экран только предложения, содержащие введённое с клавиатуры слово.
У меня было два варианта решения этой задачи, но после быстрого вымирания моих нервных клеток, первый вариант я отбросил, а вот пример второго:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <windows.h>
#include <iostream.h>
#include <fstream.h>
#include <stdio.h>
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    ifstream fin("Путь к файлу\\Text.txt", ios::in | ios::nocreate);
    if (!fin) {
        cout<<"Ошибка открытия файла."<<endl;
        cin.get();
        return 1;
    }
 
    fin.seekg(0, ios::end);
    long len=fin.tellg();
    char *buf=new char [len+1];
    char *fub=new char [len+1];
    fin.seekg(0, ios::beg);
    fin.read(buf, len);
    buf[len]='\0';
    char word[20], line[100];
    cout<<"Введите слово: "; cin>>word; cout<<endl;
    long pos;
    while (fin.getline(line, 100)) {
        if (strstr(line,word)) {
            int i, pr_n;
            pos=fin.tellg();
            for (i=pos; i>0; i--) {
                if (buf[i]=='.' || buf[i]=='!' || buf[i]=='?') break;
                pr_n=i;
            }
            for (i=pr_n; i<=pos; i++) cout<<fub[i];
            for (i=pos+1; i<len; i++) {
                cout<<buf[i];
                if (buf[i]=='.' || buf[i]=='!' || buf[i]=='?') break;
            }
            cout<<endl;
        }
    }
    cin.get();
    cin.get();
    return 0;
}
В общем я только начал с этой бредятиной (языком), так что некоторые штучки-дручки мог употребить не правильно. Зарание спасибо за помощь. Если кто поможет и даже код правильный подкинет, то прошу разъяснить там всё, а то слепо не хочется идти дальше...

Добавлено через 1 час 10 минут
я нашёл, где может быть глюк (у меня):
fin.read(buf, len);
наверно после этого указатель становится в самом конце файла, но даже если после этой строки я напишу
fin.seekg(0, ios::beg);
ничего не меняется...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.08.2008, 15:08
Ответы с готовыми решениями:

Сгенерировать две произвольные строки и определить, является ли какое-либо слово первой строки частью второй строки
Сгенерировать две произвольные строки и определить, является ли какое-либо слово первой строки...

Добавить строки, начиная со строки К1 и до строки К2, в динамический массив строк
Есть динамический массив строк. Заполняется, т.е. размер его уже известен будет. Но дальше нужно...

Удалить строки динамической матрицы, начиная со строки К1 и до строки К2
Сформировать динамический двумерный массив, заполнить его случайными числами и удалить строки,...

Удалить строки, начиная со строки К1 и до строки К2 (динамические массивы)
#include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;stdlib.h&gt; using namespace std; int main() {...

24
Почетный модератор
7356 / 2620 / 275
Регистрация: 29.07.2006
Сообщений: 13,673
02.08.2008, 15:34 2
Я писал под линухом, поэтому я тебя может отличаться чуть. И выводит она строки. С предложениями разберешься сам, правда ведь?
Код
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

int main()
{
    fstream fin("./one.cpp", ios::in);
    if (!fin) {
        cout<<"Ошибка открытия файла."<<endl;
        cin.get();
        return 1;
    }

    fin.seekg(0, ios::beg);
    char word[20], line[100];
    cout<<"Введите слово: "; cin>>word; cout<<endl;
    long pos;
    while (fin.getline(line, 100)){
        if (strstr(line,word)) {
            cout<<line<<endl;
        }
    }
    cin.get();
    cin.get();
    return 0;
}
0
72 / 72 / 1
Регистрация: 02.08.2008
Сообщений: 107
02.08.2008, 15:39  [ТС] 3
спасибо конечно большое, но вся проблема, что надо предложения выводить. если есть предложение, как это сделать, не записывая при этом файл в массив, то я выслушаю. Со строками проблем нет
0
Почетный модератор
7356 / 2620 / 275
Регистрация: 29.07.2006
Сообщений: 13,673
02.08.2008, 15:50 4
Ищи смвол конца предложения: точку, восклицательный, вопросительный знаки. А потом через strcpy копируй. Вперед.

Добавлено через 8 минут
Тут я тя весьма забавно. предложение же может быть на нескольких строках. Поэтому если символ не нашелся, то надо читать следующую строку и следующую, пока не найдешь. Причем, массив не нужен. Зачем? В текущей строке есть совпадение - вывели ее (начиная с последнего знака перед словом). Если не нашли знака конца предложения после совпадения - считали новую строку, если и там его нет - то выводим ее. Простой цикл получается.
0
72 / 72 / 1
Регистрация: 02.08.2008
Сообщений: 107
02.08.2008, 16:17  [ТС] 5
а если стихотворение? может нашлось слово на строке так пятой после начала предложения.
ну ладно, я конечно могу на столько упростить, но тогда совсем по-детски получается

Добавлено через 21 минуту
короче, даже если я избегу этого гемороя, то дальше мне всё равно понадобятся знания вот этого:
fin.read(buf, len);
fin.seekg(0, ios::beg);
установит ли он позицию на начала файла? У меня не устанавливает, тогда как это сделать?
0
Почетный модератор
7356 / 2620 / 275
Регистрация: 29.07.2006
Сообщений: 13,673
02.08.2008, 16:57 6
Я, кстати, вообще не понял зачем ты эти все буфера делал, зачем на конец файла перепрыгивал... Все это лишнее. Хотя, кому как удобнее.
0
72 / 72 / 1
Регистрация: 02.08.2008
Сообщений: 107
02.08.2008, 17:59  [ТС] 7
вот мне, например, надо знать, какой следующий знак, буква, цифра идёт после найденного мною, как это сделать, если только у тебя весь текс не является массивом, тогда ты можешь обратиться к каждому элементу текста. Может в этом задании не так это сильно востребовано, но вот в следующем это очень упростит задачу...
Так всё таки, как насчёт моего вопроса
0
Почетный модератор
7356 / 2620 / 275
Регистрация: 29.07.2006
Сообщений: 13,673
02.08.2008, 18:17 8
Госпади, да все он нормально устанавливает. Ты установил на начало. Потом читаешь буфер. После того, как ты считал буфер указатель у тебя где? Вооот. Будь внимательней.
0
72 / 72 / 1
Регистрация: 02.08.2008
Сообщений: 107
02.08.2008, 18:23  [ТС] 9
я же знаю, что не нормально, я написал обычный код, где от просто все подряд строки выводит, что-то похожее на твой, только без поиска. Там мой buf никак не используется, но если я ставлю fin.read, то он у меня ничего не выводит, а если убираю его, то всё работает.
0
Почетный модератор
7356 / 2620 / 275
Регистрация: 29.07.2006
Сообщений: 13,673
02.08.2008, 18:28 10
Да не выводит он потому что после read у тебя указатель в опять конце! Я же написал...
0
72 / 72 / 1
Регистрация: 02.08.2008
Сообщений: 107
02.08.2008, 18:29  [ТС] 11
так я же пишу, что с помощью fin.seekg(0, ios::end); я его ставлю в начало, ибо в книге написано, что так надо делать, но он не ставится
а если стихотворение? может нашлось слово на строке так пятой после начала предложения.
ну ладно, я конечно могу на столько упростить, но тогда совсем по-детски получается

Добавлено через 21 минуту
короче, даже если я избегу этого гемороя, то дальше мне всё равно понадобятся знания вот этого:
fin.read(buf, len);
fin.seekg(0, ios::beg);
установит ли он позицию на начала файла? У меня не устанавливает, тогда как это сделать?
0
Почетный модератор
7356 / 2620 / 275
Регистрация: 29.07.2006
Сообщений: 13,673
02.08.2008, 18:32 12
Ну если и после не помогает, то не имею никакого понятия, как это сделать. У меня все работает. Попробуй возвращаемое значение проверить. Оно там вроде должно быть.
0
72 / 72 / 1
Регистрация: 02.08.2008
Сообщений: 107
02.08.2008, 18:34  [ТС] 13
гы, даже стыдно уже спрашивать: а по конкретней с предыдущим предложением, я слегка не понял...
0
Почетный модератор
7356 / 2620 / 275
Регистрация: 29.07.2006
Сообщений: 13,673
02.08.2008, 18:38 14
Ну функция должна возваращать значение, которое даст понять: удачно она завершилась, или нет. Для этой вроде -1 в случае неудачи. Если память не изменяет. Или по фалагам failbit, badbit. Не, вроде, все-таки, по флагам
0
72 / 72 / 1
Регистрация: 02.08.2008
Сообщений: 107
02.08.2008, 18:40  [ТС] 15
и куда это втыкнуть надо...
0
Почетный модератор
7356 / 2620 / 275
Регистрация: 29.07.2006
Сообщений: 13,673
02.08.2008, 18:46 16
Блин, давай немного сам будешь разбираться, а? Используй fail() у потока.
0
72 / 72 / 1
Регистрация: 02.08.2008
Сообщений: 107
02.08.2008, 18:58  [ТС] 17
тоесть если я напишу
fin.getline(line, sizeof(line)) ;
if (fin.fail()) cout << "хрен" << endl;
то если ошибка, то мне хрен выведет?
он его выводит
0
Почетный модератор
7356 / 2620 / 275
Регистрация: 29.07.2006
Сообщений: 13,673
02.08.2008, 19:06 18
Если выводит, значит ошибка. Теперь проверяй сами биты. Проверь eof, проверь bad.
0
72 / 72 / 1
Регистрация: 02.08.2008
Сообщений: 107
02.08.2008, 19:10  [ТС] 19
короче, позиция у меня в конце файла... чтоб эту Павловскую с её задачами...
спасибо за помощь, в сентябре у препода спрошу...
не надо мучаться, я на это дело забил, пойду дальше...
0
Почетный модератор
7356 / 2620 / 275
Регистрация: 29.07.2006
Сообщений: 13,673
02.08.2008, 19:12 20
Это самое плохое решение Ну да ладно.

Добавлено через 50 секунд
Кинь сюда код итоговый. Где у тя там позиция в конце...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.08.2008, 19:12

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

Ввести две символьных строки. Выполнить поиск второй строки в первой и вывести номер позиции первой строки, с которой вторая строка содер-жится в ней
Ввести две символьных строки. Выполнить поиск второй строки в первой и вывести номер позиции первой...

Переписать все строки файла удаляя пробелы в конце каждой строки
Дан текстовый файл F.txt. Переписать все строки файла F.txt в файл G.txt, удаляя все пробелы в...

Как первые два символа строки переставить в конец этой строки?
Собственно вопрос

Как считать строки из файла, если там больше одной строки?
Как считать строки из файла в массив. Если в файле одна строка, то нет проблем, но если несколько,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.