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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программа вместе с результатом выводит "мусор" 
:(
    Опции темы
АгатаКристи
Дата 24.4.2009, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

Я пи1шу программу

превратится в
Код

 Я программууМММММММММММММММММММММММММММММММММММММММММММММуММММ.¬вЁя

Если же в последнее слово вставить цифру, то начинает работать корректно.

Программа: 
Код

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
     setlocale(LC_ALL,"RUSSIAN");
     char ch;
     char text[50];
     char temp[1024];
     int i = 0;
     char *str;
     str = " ";
     memset(temp, 0, sizeof(temp));
     ifstream in("input.txt", ios::in | ios::binary);
     if(!in) 
     { 
          cout << "Не удается открыть файл.\n"; 
          return 1;
     }

     cout << "Исходный файл:\n";
     while(!in.eof())
     {
          in.get(ch);
          text[i] = ch;
          if(!in.eof()) cout << ch;
          i++;
     }
     str = strtok (text," ");
     while(str!='\0')
     {
           if((strchr(str,'0') == NULL)
           && (strchr(str,'1') == NULL)
           && (strchr(str,'2') == NULL)
           && (strchr(str,'3') == NULL) 
           && (strchr(str,'4') == NULL)
           && (strchr(str,'5') == NULL)
           && (strchr(str,'6') == NULL)
           && (strchr(str,'7') == NULL)
           && (strchr(str,'8') == NULL) 
           && (strchr(str,'9') == NULL))
      {

           cout << str << " ";
           strcat(temp, " ");
           strcat(temp, str);
      }
     str = strtok (NULL," ");
     }
     cout << "\n";
     in.close();
     
     ofstream out("input.txt", ios::in | ios::binary | ios::trunc);
     if(!out) 
     { 
          cout << "Не удается открыть файл.\n"; 
          return 2;
     }
     out << temp;
     out.close();

     return 0;
}

PM MAIL   Вверх
Anikmar
Дата 24.4.2009, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Не варит у меня башка искать ошибку у вас в коде. Я не врубаюсь как вы там хотите делать.
В общем что-то такое:
Код

void GetOnlyCharWords(void)
{
    char CurrentSymbol;
    bool FlagGoodWord = false;
    bool FlagStartWord = false;
    char TempBuff[256];
    int CurrentIndex = 0;
    ifstream InputFile("input.txt");
    ofstream OutputFile("output.txt");

    while(!InputFile.eof())
    {
        InputFile.get(CurrentSymbol);
        if (InputFile.eof()) break;
        if ((CurrentSymbol == ' ')||(CurrentSymbol == '\n'))
        {
            if (FlagGoodWord)
            {
                TempBuff[CurrentIndex] = 0;
                OutputFile << TempBuff << ' ';
                FlagGoodWord = false;
            }
            if (CurrentSymbol == '\n') OutputFile << endl;
            FlagStartWord = false;
            CurrentIndex = 0;
        }
        else
        {
            if (!FlagStartWord)
            {
                FlagStartWord = true;
                FlagGoodWord = true;
            }
            if ((CurrentSymbol >= '0')&&(CurrentSymbol <= '9'))
                FlagGoodWord = false;
            else
            {
                if (FlagGoodWord)
                    if (CurrentIndex < 255)
                        TempBuff[CurrentIndex++] = CurrentSymbol;
            }
        }
    }
    if (FlagGoodWord)
    {
        TempBuff[CurrentIndex] = 0;
        OutputFile << TempBuff;
    }
    InputFile.close();
    OutputFile.close();
}

PM MAIL ICQ   Вверх
Dov
Дата 25.4.2009, 01:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Код
int main()
{
    char        text[50];
    char        temp[1024]    = "";

    ifstream    in( "input.txt" );    
    if( in.is_open() )
    {
        cout << "Исходный файл: ";
        while( in >> text )
        {
            cout << text << " ";
            if( !strpbrk( text, "0123456789" ) )
            {
                strcat( temp, text );
                strcat( temp, " " );
            }
        }
    }
    
    cout << "\nРезультат    : " << temp << endl;
    in.close();

    ofstream    out( "input.txt" );
    if( out.is_open() )
        out << temp;
    
    out.close();
    
    return 0;
}


Это сообщение отредактировал(а) Dov - 25.4.2009, 01:49


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Cheloveck
Дата 25.4.2009, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код

     char *str;
     str = " ";

а где выделение памяти под str?


--------------------
user posted image
PM Jabber   Вверх
Rififi
Дата 25.4.2009, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Cheloveck, 
а где выделение памяти под str? 
отсутствует, за ненадобностью. что, впрочем, не отменяет кривизны записи.
правда, судя по коду, глубинный смысл этой инициализации неясен...

PM MAIL   Вверх
Dov
Дата 25.4.2009, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Цитата(Rififi @  25.4.2009,  14:11 Найти цитируемый пост)
Cheloveck, а где выделение памяти под str? отсутствует, за ненадобностью. что, впрочем, не отменяет кривизны записи.правда, судя по коду, глубинный смысл этой инициализации неясен...


Rififi, давно хотел тебя спросить. Скажи честно,  тебе вера не позволяет юзать теги 'QUOTE' или есть какая-то другая причина? Читая твои посты, кажется, что ты не цитируешь автора поста, а обращаешься к нему напрямую.   smile

Добавлено через 3 минуты и 15 секунд
Такое впечатление, что ты сам спрашиваешь и сам же отвечаешь...


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Static
Дата 27.4.2009, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я так понял, что проблема тут:

Код

str = strtok (text," ");


У Вас в конце текста пробела нет. Т.е. после последнего слова программа рыщет по памяти до тех пор, пока не найдет в ней код проблела. Если поставите пробел - должно корректно работать. Например:

Код

while(!in.eof())
     {
          in.get(ch);
          text[i] = ch;
          if(!in.eof()) cout << ch;
          i++;
     }
     text[i]=' '; // <----------
     str = strtok (text," ");

--------------------
Я не настолько безнадежен, как кажется...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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