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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с файлами 
:(
    Опции темы
Uter123
Дата 2.11.2015, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Написать программу которая считывает текстовый файл , и вывести на экран только цитаты, то есть предложения, помещенные в ковычки.
Проверьте не пойму почему зацикливается.

Код

#include "stdafx.h"
#include "stdio.h"
#include "iostream"
#include "conio.h"
using namespace std;


int main(int argc, char* argv[])
{
    FILE *retro,*etr;
    int i=0,j=0,a,b;
    char x[80]=" ";
    retro=fopen(argv[1],"r+");
    if(retro==NULL)
    {
        cout<<"net faila"<<endl;
        exit(0);
    }
    cout<<"idet zapis v fail...";
    while(!feof(retro))
    {
        fgets( x, 80 , retro ); 
        for(int j=0;x[i]!='\0';j++)
        {
            cout<<endl;
            a=0;b=0;
            for(int i=j;x[i]!='\0';i++)
            {
                if(x[i]=='"')
                {
                    a=i;
                    break;
                }
            }
            for(int i=a+1;x[i]!='\0';i++)
            {
                if(x[i]=='"')
                {
                    b=i;
                    break;
                }
            }
            for(int i=a;i<=b;i++)
            {
                cout<<x[i];
            }
            j=b+2;
        }
    }
    fclose(retro);
    _getch();
    return 0;
}

PM MAIL   Вверх
feodorv
Дата 2.11.2015, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Uter123 @  2.11.2015,  20:58 Найти цитируемый пост)
Проверьте не пойму почему зацикливается.
Весь код не смотрел. Но сходу заметно такое:
Цитата(Uter123 @  2.11.2015,  20:58 Найти цитируемый пост)
       for(int j=0;x[ ij ]!='\0';j++)



Цитата(Uter123 @  2.11.2015,  20:58 Найти цитируемый пост)
            j=b+2;
Почему +2???


Цитата(Uter123 @  2.11.2015,  20:58 Найти цитируемый пост)
    while(!feof(retro))
    {
        fgets( x, 80 , retro ); 
Корректно это записывается так:
Код

while( fgets( x, 80 , retro ) != NULL )




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


Опытный
**


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

Репутация: 1
Всего: 6



Цитата(Uter123 @  2.11.2015,  20:58 Найти цитируемый пост)
for(int j=0;x[i]!='\0';j++)

Подозреваю, что у вас x[i] никогда не будет равно нулевому символу, потому что в i у вас храниться индекс ковычек.
Во-вторых, у вас может быть выход за пределы массива в случае, когда строка заканчивается ковычкой. 
Код

j=b+2;

Вот именно из-за этого и получится так.

Предлагаю вам такой вариант:

Код

for (int j = 0; x[j] != '\0', j <= strlen(x); j++)
    {
        a = 0; b = 0;
        for (int i = j; x[i] != '\0'; i++)
        {
            if (x[i] == '"')
            {
                a = i;
                break;
            }
        }
        for (int i = a + 1; x[i] != '\0'; i++)
        {
            if (x[i] == '"')
            {
                b = i;
                break;
            }
        }
        for (int i = a; i <= b; i++)
        {
            cout << x[i];
        }
        j = b + 1;
    }


Это сообщение отредактировал(а) rudolfninja - 2.11.2015, 21:43
PM MAIL Skype   Вверх
Uter123
Дата 2.11.2015, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 там j=b+1; это попытка исправить зацикливание.
PM MAIL   Вверх
feodorv
Дата 2.11.2015, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Uter123 @  2.11.2015,  21:41 Найти цитируемый пост)
там j=b+1; это попытка исправить зацикливание. 

Тоже не верно. Зачем +1???


Как насчет 
Цитата(Uter123 @  2.11.2015,  20:58 Найти цитируемый пост)
for(int j=0;x[i]!='\0';j++)
???



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
rudolfninja
Дата 2.11.2015, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 1
Всего: 6



Цитата(feodorv @  2.11.2015,  21:51 Найти цитируемый пост)
Тоже не верно. Зачем +1???

Как я понимаю, чтоб избежать ненужные итерации. В b хранится индекс ковычек, поэтому есть смысл двигаться от них, а не от следующего символа
PM MAIL Skype   Вверх
feodorv
Дата 2.11.2015, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(rudolfninja @  2.11.2015,  21:53 Найти цитируемый пост)
Как я понимаю, чтоб избежать ненужные итерации. В b хранится индекс ковычек, поэтому есть смысл двигаться от них, а не от следующего символа 

"+1" это не оправдывает)))


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Uter123
Дата 2.11.2015, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Это чтобы когда нашли одно вхождение ковычек, можно было двигаться дальше чтобы найти следующее  вхождение ковычек.
PM MAIL   Вверх
feodorv
Дата 2.11.2015, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Uter123 @  2.11.2015,  22:00 Найти цитируемый пост)
Это чтобы когда нашли одно вхождение ковычек, можно было двигаться дальше чтобы найти следующее  вхождение ковычек.

Это понятно. Но зачем здесь лишнее "+1"? Если бы Вы оформили код так:
Код

int j = 0;
while( x[j] != '\0' )
{
   ...
   j = b+1;
}
то вопросов бы не возникло. Но ведь у Вас полноценный for:
Цитата(Uter123 @  2.11.2015,  20:58 Найти цитируемый пост)
        for(int j=0;x[j]!='\0';j++)




--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
math64
Дата 3.11.2015, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Цитата(rudolfninja @  2.11.2015,  21:39 Найти цитируемый пост)
Код
for (int j = 0; x[j] != '\0', j <= strlen(x); j++)

Результат [j] != '\0' будет игнорироваться.
Нужно x[j] != '\0' && j <= strlen(x) - хотя вторая проверка лишняя.

PM   Вверх
xvr
Дата 3.11.2015, 14:26 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Как то у вас всё сложно и запутанно. Задача решается гораздо проще (привожу только внутренний цикл и оставляю помесь ostream/FILE как у вас было):
Код

FILE* retro;
bool in_quote = false;
int sym;
...

while( (sym=fgetc(retro)) != EOF)
{
  if (sym=='"')
   {
     in_quote=!in_quote;
     if (!in_quote) cout << endl;
   }
  else if (in_quote) cout << (char)sym;
}



Это сообщение отредактировал(а) xvr - 3.11.2015, 14:28
PM MAIL   Вверх
feodorv
Дата 3.11.2015, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(xvr @  3.11.2015,  14:26 Найти цитируемый пост)
Задача решается гораздо проще 

Кстати, и правильнее, так как находятся цитаты, расположенные на нескольких строчках.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Uter123
Дата 3.11.2015, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Нам препод не разрешает использовать   bool. Говорит чтобы мы его обходили стороной.

PM MAIL   Вверх
feodorv
Дата 3.11.2015, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Uter123 @  3.11.2015,  21:03 Найти цитируемый пост)
Говорит чтобы мы его обходили стороной.
Ну так обходите:
Код

FILE* retro;
int in_quote = 0;
int sym;
...
while( (sym=fgetc(retro)) != EOF)
{
  if (sym=='"')
   {
     in_quote=!in_quote;
     if (!in_quote) cout << endl;
   }
  else if (in_quote) cout << (char)sym;
}



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


Новичок



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

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



А что означает эта строка :
in_quote=!in_quote;
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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