Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 11.03.2018
Сообщений: 115
1

После выполнения программа выводит лишнее

08.03.2021, 18:45. Показов 523. Ответов 5

Author24 — интернет-сервис помощи студентам
Здравствуйте! Мне нужно написать программу, которая выведет на экран и в файл последовательности цифр, в которых не повторяются цифры. В файле последовательности отделены одним и более пробелов, переводом строки, каретки. В выходном файле все последовательности должны быть записаны через одиночный пробел. Проблема такова. что после выполнения программы, кроме нужной мне последовательности, в конце может выводится какое-либо число, которое не должно было выводиться вовсе.
Например, в файле содержится следующее:
5 \n76
\t77 78 9 89
00 78 12
13
1

Вывести должно: 5 76 78 9 89 78 12 13 1, а выводит: 5 76 78 9 89 78 12 13 1 3
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
 
//добавляем в вектор все последовательности, удовлетворяющие заданию
vector<char> processText(const char* const text,int counter) {
  vector<char> vec;
  int a = 0;
  for (int i = 0; i < counter - 1; ++i) {
      if (text[i] == ' ' || text[i] == '\0' || text[i] == '\n' || text[i] == '\t') {
          bool x = 1;
          for (int j = a; j < i; ++j) {
              for (int h = j + 1; h < i; ++h) {
                  if (text[j] == text[h]) {
                      x = 0;
                      break;
                  }
              }
 
          }
          if (x) {
              bool x2 = 0;
              for (int k = a; k < i; ++k) {
                  vec.push_back(text[k]);
                  x2 = 1;
              }
              if (x2)
                  vec.push_back(' ');
          }
          a = i + 1;
      }
  }
  return vec;
}
 
//удаляем лишние пробелы
char* ch_duplicate(char* s, char c) {
    char* t = s, * p = s;
    while (*p) {
        if (*p != c || *(p + 1) != c)
            ++s;
        *s = *(++p);
    }
    return t;
}
 
//удаляем символы перевода строки и каретки(если смотреть по примеру, то они в исходном файле
//присутствуют в виде символов)
char* ch_deleter(char* text,int counter) {
    char* t = text;
    for (int i = 0; i < counter; ++i) {
        if (text[i] == '\\' || text[i] == 'n' || text[i] == 't') {
            text[i] = ' ';
        }
    }
    return text;
}
 
 
int main() {
    ifstream ifs; //объект класса ifstream для открытия файла для чтения
    ifs.open("input.txt");//открываем файл
    int counter = 0;//счетчик символов в файле
    //считаем символы
    while (!ifs.eof())
    {
        char ch;
        ch = ifs.get();
        counter++;
    }
    ifs.close();//закрыли файл
    //открыли снова, чтобы заполнить массив 
    ifs.open("input.txt");
    char* text = new char[counter];//объявляем массив размера counter
    
    ifs.getline(text, counter, '\0'); //считываем все символы из файла
    ch_deleter(text,counter); //удаляем символы перевода строки и каретки, которые представлены в виде символов
    ch_duplicate(text, ' '); //удаляем лишние проеблы
 
    vector<char> vec = processText(text,counter);//заполняем вектор последовательностями, подходящими по условию
    
    //поскольку практика показывает, что в конце вектора могут оставаться пробелы, то находим последнюю цифру
    int i2;
    for (int i = vec.size()-1; i != 0; --i) {
        if (!isdigit(vec[i]))
        {
            i2 = i;
            break;
        }
    }
 
    ofstream ofs; //заводим объект класса ofstream для вывода в файл
    //открываем файл для вывода
    ofs.open("output.txt");
    //выводим на экран и в файл наш ответ
    for (int i = 0; i < i2; ++i) {
        cout << vec[i];
        ofs << vec[i];
    }
    ofs.close();
    ifs.close();
    delete[]text;//освобождаем память, выделенную под массив
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.03.2021, 18:45
Ответы с готовыми решениями:

Программа не выводит ничего; вывод потока пустой после выполнения функции
После выполнения одной функции у меня ничего не выводится в консоли через std:cout Main...

Программа работает, но выводит лишнее.
Уделение элементов в массиве, расположенных между максимальным и минимальным элементом: #include...

Программа выводит лишнее число
Текст задачи: В двух словах о проблеме: По идее в первую строку выходного файла OUTPUT.TXT нужно...

Выводит некоректное число после выполнения программы по считыванию листьев в дереве
Выводит некоректное число после выполнения программы по считыванию листьев в дереве. Задание: Дан...

5
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
08.03.2021, 19:50 2
Цитата Сообщение от Tretlenz Посмотреть сообщение
роме нужной мне последовательности, в конце может выводится какое-либо число, которое не должно было выводиться вовсе.
Например, в файле содержится следующее:
Для начала - не надо здесь мудрить с вводом. std::ifstream прекрасно умеет пропускать все эти символы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
{
    std::stringstream stm;
    stm
        << "5 \n76"
        << "\t77 78 9 89 "
        << " 00 78 12";
 
    std::vector<int> arr;
    for (int n; stm >> n; )
        arr.push_back(n);
 
    for (auto n: arr)
        std::cout << n << " ";
 
    std::cout << std::endl;
}
здесь std::stringstream можно спокойно заменить на соответствующий std::ifstream
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
08.03.2021, 20:43 3
oleg-m1973, разве твой вариант сработает для последовательностей с ведущими нулями ? да и вообще зачем вектор в этой задаче ?

мой вариант - переделать на файловый ввод-вывод не сложно
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
#include <iostream>
#include <sstream>
#include <vector>
#include <string>
using namespace std;
 
bool is_repeat (string const&s)
{   
    size_t size=s.size();
    for (size_t i = 0; i < size; i++)                    
        for (size_t j = 0; j < size; j++)
        if (i!=j && s[i]==s[j]) return true;        
    return false;    
}        
 
int main()
{
    string str="5 \n76\t77 78 9 89\n00 78 12\n909    00 01", s;
    stringstream in(str);
    
    while(in >> s)
    {
        if(!is_repeat(s)) cout << s << " ";
    }
    cout << "\n";
    
system("pause");
return 0;
}
Добавлено через 16 минут
Цитата Сообщение от Tretlenz Посмотреть сообщение
в конце может выводится какое-либо число, которое не должно было выводиться
не применяйте eof при чтении с файла
0
1 / 1 / 0
Регистрация: 11.03.2018
Сообщений: 115
08.03.2021, 21:12  [ТС] 4
Дело в том, что все то, что у меня написано - так быть и должно по заданию. Вопрос в том, почему он неправильно работает?

Добавлено через 1 минуту
В чем я ошибся при написании функции обработки текста(та, что с вектором)?
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
08.03.2021, 21:22 5
Цитата Сообщение от Tretlenz Посмотреть сообщение
все то, что у меня написано - так быть и должно по заданию
Вы так считаете ? под то условие которое Вы привели вектор не нужен. если есть какое-то другое условие - напишите его

что касается Вашего варианта
Цитата Сообщение от Tretlenz Посмотреть сообщение
почему он неправильно работает?
повторяю:
Цитата Сообщение от Yetty Посмотреть сообщение
не применяйте eof при чтении с файла
0
1 / 1 / 0
Регистрация: 11.03.2018
Сообщений: 115
08.03.2021, 21:55  [ТС] 6
Цитата Сообщение от Yetty Посмотреть сообщение
повторяю:
Это я уже убрал, но проблема осталась.
Цитата Сообщение от Yetty Посмотреть сообщение
Вы так считаете ? под то условие которое Вы привели вектор не нужен. если есть какое-то другое условие - напишите его
Реализовать на языке C++ программу обработки
текстового файла, содержащего строки символов произвольной длины, в соответствии с
индивидуальным заданием. В основе программы должна лежать функция,
обрабатывающая текст и возвращающая список слов, удовлетворяющих условию задания.
Результат обработки вывести на экран и записать в выходной текстовый файл.
Все операции обработки и хранения строк должны использовать символьные
массивы (char*). Использование класса string не допускается. Использование класса vector
допускается только для хранения списка слов
0
08.03.2021, 21:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.03.2021, 21:55
Помогаю со студенческими работами здесь

Выводит лишнее
using namespace std; char EX; void m() { cout &lt;&lt; &quot;gfd&quot; &lt;&lt; endl; for (int i = 0; i &lt; 50...

Рекурсия выводит лишнее, не могу убрать их
Есть рекурсивная функция, выводящая страницы с ее подстраницами, с неограниченной вложенностью....

Woocommerce product filter выводит лишнее слово
Здравствуйте, есть зародыш интернет магазина на плагине Woocommerce. И я установил на него...

Программа закрывается после выполнения
Сделайте так, что б после выполнения функции, моя программа не закрывалась. program rect; var ...

Программа не завершается после выполнения
программа выводит определённые строки текстового файла на экран, сортируя их. всё работает...

Вылетает программа после выполнения
Добрый день! Написал программу, суть простецкая - есть два списка, хранящие некие элементы. Создать...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru