Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Jeev@s
2 / 2 / 0
Регистрация: 13.11.2012
Сообщений: 21
#1

Исправить косяк в программе - C++

06.06.2013, 02:28. Просмотров 506. Ответов 19
Метки нет (Все метки)

Ребят, есть программа, работающая с текстовым файлом (потоковый ввод-вывод). Если в файле имеется один символ (корректный-цифра), программа выводит сообщение, что файл пуст, однако, если добавить в конец пробел, выдает, что символ один. Как это исправить? Чтобы выводилось правильное определение количества элементов. Можно это сделать средствами работы с потоками?

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
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <iomanip>
#include <conio.h>
#include <cctype>
#include <Windows.h>
using namespace std;
 
int main()
{
        setlocale(LC_CTYPE, "RUS");
        system ("cls");
        ifstream f;
        char name[255];
     
           for( ; ; )
        {       cout<<"Введите имя файла с расширением: ";
              cin.getline (name,255); 
                f.open(name, ios_base::in);
                if(!f.is_open()) {
                        cout<<"Ошибка открытия файла: ' "<<name<<" ' "<<"\n"
                            <<"Нажмите любую клавишу для продолжения..."<<"\n";
                        _getch();}
                else break;
                           }
        int n = 0;
        int buff = 0;
        while (!f.eof())
        {
                f>>buff;
                char ch = f.peek();
                if (!f.eof() && (f.fail() || !(ch == ' ' || ch == '\n')))
                {
                        cout<<"Ошибка чтения!"<<"\n" 
                            <<"Найден недопустимый символ в элементе с порядковым номером: "<< n+1<<"\n"
                            <<"Дальнейшее выполнение программы прервано. Исправьте файл."<<"\n"
                            <<"Нажмите любую клавишу для выхода...";
                        _getch();
                        return -1;
                }
        }
            if (n==0)
        {
                cout<<"Файл пуст! Дальнейшее выполнение программы невозможно! Заполните массив!"<< "\n"
                    << "Нажмите любую клавишу для выхода...";
                _getch();
                return -1;
        }
       if(n==1)
        {
                cout<<"Файл содержит один элемент!" <<"\n"
                    <<"Нажмите любую клавишу для выхода...";
                _getch();
                return -1;
        }
        f.close();
        cout<<n;
        int *p = new int[n]; // char *p=new(nothrow) // int *p; p= new int;  // *p=new int (1) // delete [] p; delete p
        if (p == NULL)
        {
                cout<<"\n"<<"В системе недостаточное количество памяти для создания массива."
                    <<"\n"<<"Дальнейшее выполнение программы прервано." << "\n"
                    <<"Нажмите любую клавишу для выхода...";
                _getch();
                return -1;
        }
        else
        {
            int sum=0;
                f.open(name, ios :: in);
                for(int i = 0; i < n; i++)
                {
                    f>>p[i];
                }
                cout << "\n" << " Исходный массив: " << "\n";
                cout << setw(10) << "Номера: ";
                for (int i = 1; i <= n; i++)
                {
                    cout << setw(3) << i << ' ';
                }
                cout << "\n";
                cout << setw(10)<<"Элементы: ";
                for (int i = 0; i < n; i++)
                {
                    cout << setw(3) << *(p+i) << ' ';
                }
                cout << "\n";
                    for(int i = 0; i < n; i++)
                        if(p[i]<3)
                        sum++;
                delete [] p;
                cout<<"\n"<<"Cумма элементов массива, меньших трех: "<<sum<<"\n";
                cout<<"\n Для выхода нажмите любую клавишу...";
                cout << "\n";
                f.close();
                                
                }
        _getch();
        return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2013, 02:28     Исправить косяк в программе
Посмотрите здесь:

Где косяк в коде и как исправить? - C++
#include &lt;iostream&gt; using namespace std; int main() { setlocale (LC_CTYPE, &quot;Russian&quot;); cout &lt;&lt; &quot;Введите числа нажимая...

Исправить ошибки в программе - C++
#include&lt;stdio.h&gt; void NewMatr(int **matr, int size) { for(int i=0;i&lt;size;i++) for(int j=0;j&lt;size;j++) {...

Исправить ошибки в программе - C++
Написать программу которая выводит ваше имя на экран в основном модуле и в модуле функции... #include&lt;stdio.h&gt; fun(); voind main()...

Исправить ошибку в программе - C++
здравствуйте,помогите пожалуйста,выдает ошибку в этой строке if (q==j) #include &lt;cstdlib&gt; #include &lt;iostream&gt; #include...

Исправить ошибку в программе - C++
#include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;time.h&gt; // Задание: // В одномерном массиве, состоящем из n вещественных...

Исправить ошибку в программе - C++
не могу сдать зачет((( в С++ полный ноль((( надеюсь на ваше понимание.. Укажите и исправьте ошибку в программе. Полагайте, что int...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.06.2013, 03:22     Исправить косяк в программе #2
У меня что так, что так - "Файл пуст!" Где у вас изменение n при считывании числа?

Добавлено через 15 минут
После каждого числа в файле - пробел:
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
for( ; ; )
        {       
            cout<<"Введите имя файла с расширением: ";
            cin.getline(name, 255); 
            
            f.open(name, ios_base::in);
            if(!f.is_open()) 
            {
                    cout<<"Ошибка открытия файла: ' "<<name<<" ' "<<"\n"
                        <<"Нажмите любую клавишу для продолжения..."<<"\n";
                    _getch();
            }
            else break;
        }
        
        int n = 0;
        int buff = 0;
        while (!f.eof())
        {
                f >> buff;
                if (f.eof()) break;
                else if (f.fail())
                {
                        cout<<"Ошибка чтения!"<<"\n" 
                            <<"Найден недопустимый символ в элементе с порядковым номером: "<< n + 1<<"\n"
                            <<"Дальнейшее выполнение программы прервано. Исправьте файл."<<"\n"
                            <<"Нажмите любую клавишу для выхода...";
                        _getch();
                        return -1;
                }
                n++;
        }
        
        if (n == 0)
        {
                cout<<"Файл пуст! Дальнейшее выполнение программы невозможно! Заполните массив!"<< "\n"
                    << "Нажмите любую клавишу для выхода...";
                _getch();
                return -1;
        }
        
        if(n == 1)
        {
                cout<<"Файл содержит один элемент!" <<"\n"
                    <<"Нажмите любую клавишу для выхода...";
                _getch();
                return -1;
        }
        f.close();
        
        cout<<n;
Jeev@s
2 / 2 / 0
Регистрация: 13.11.2012
Сообщений: 21
06.06.2013, 09:09  [ТС]     Исправить косяк в программе #3
Ну и в таком случае выводит то же самое.
Croessmah
Модератор
Эксперт CЭксперт С++
13059 / 7322 / 817
Регистрация: 27.09.2012
Сообщений: 18,074
Записей в блоге: 3
Завершенные тесты: 1
06.06.2013, 09:21     Исправить косяк в программе #4
Хм... а тут что такое?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
        int n = 0;
//...
        while (!f.eof())
        {
//n в цикле не изменяется
        }
            if (n==0)//Всегда true
        {
                cout<<"Файл пуст! Дальнейшее выполнение программы невозможно! Заполните массив!"<< "\n"
                    << "Нажмите любую клавишу для выхода...";
                _getch();
                return -1;
        }
собственно об это м писал alsav22
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.06.2013, 15:57     Исправить косяк в программе #5
Цитата Сообщение от Jeev@s Посмотреть сообщение
Ну и в таком случае выводит то же самое.
В первом случае в файле: 12 34 45 , во втором - 12 :
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
#include <iostream>
#include <fstream>
#include <conio.h>
using namespace std;
 
int main() 
{
        setlocale(LC_CTYPE, "RUS");
        system ("cls");
        ifstream f;
        char name[255];
     
        for( ; ; )
        {       
            cout<<"Введите имя файла с расширением: ";
            cin.getline(name, 255); 
            
            f.open(name, ios_base::in);
            if(!f.is_open()) 
            {
                    cout<<"Ошибка открытия файла: ' "<<name<<" ' "<<"\n"
                        <<"Нажмите любую клавишу для продолжения..."<<"\n";
                    _getch();
            }
            else break;
        }
        
        int n = 0;
        int buff = 0;
        while (!f.eof())
        {
                f >> buff;
                if (f.eof()) break;
                else if (f.fail())
                {
                        cout<<"Ошибка чтения!"<<"\n" 
                            <<"Найден недопустимый символ в элементе с порядковым номером: "<< n + 1<<"\n"
                            <<"Дальнейшее выполнение программы прервано. Исправьте файл."<<"\n"
                            <<"Нажмите любую клавишу для выхода...";
                        _getch();
                        return -1;
                }
                n++;
        }
        
        if (n == 0)
        {
                cout<<"Файл пуст! Дальнейшее выполнение программы невозможно! Заполните массив!"<< "\n"
                    << "Нажмите любую клавишу для выхода...";
                _getch();
                return -1;
        }
        
        if(n == 1)
        {
                cout<<"Файл содержит один элемент!" <<"\n"
                    <<"Нажмите любую клавишу для выхода...";
                _getch();
                return -1;
        }
        f.close();
        
        cout << n << endl;
  
  system("pause");
  return 0;
}
Миниатюры
Исправить косяк в программе   Исправить косяк в программе  
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.06.2013, 16:03     Исправить косяк в программе #6
Если же вас интересует вопрос: как сделать правильный подсчёт чисел в файле, если неизвестно, что стоит после последнего числа в файле, то сразу возникает встречный вопрос: как создаётся такой файл с числами? Если с помощью записи чисел в файл через пробел, то после каждого числа в файле будет пробел и зачем тогда голову ломать над первым вопросом?
Jeev@s
2 / 2 / 0
Регистрация: 13.11.2012
Сообщений: 21
11.06.2013, 02:40  [ТС]     Исправить косяк в программе #7
Да, нужен правильный подсчет. Проблема была в том, что если в файле одно число, программа выдает, что файл пуст. Но если после этого числа вписать еще пробел, то программа выдает правильное сообщение (элемент один).
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.06.2013, 04:25     Исправить косяк в программе #8
Вопрос остался без ответа.
Цитата Сообщение от alsav22 Посмотреть сообщение
сразу возникает встречный вопрос: как создаётся такой файл с числами? Если с помощью записи чисел в файл через пробел, то после каждого числа в файле будет пробел и зачем тогда голову ломать над первым вопросом?
Jeev@s
2 / 2 / 0
Регистрация: 13.11.2012
Сообщений: 21
11.06.2013, 12:38  [ТС]     Исправить косяк в программе #9
Так. Пользователь записывает в файл числа. Но он может ввести всего одно число и не поставить после него пробел. Конец файла будет сразу "впритык" за этим числом. Тогда программа считает ошибочно количество элементов.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.06.2013, 17:28     Исправить косяк в программе #10
Цитата Сообщение от Jeev@s Посмотреть сообщение
Пользователь записывает в файл числа.
Покажите каким способом. Пользователь не может ничего записывать в файл. Пользователь может вводить числа, допустим, с консоли в программу. Если числа вводятся в числовую переменную, то никакого пробела после числа быть не может. Остальное делает программа. Как она написана, так числа и будут записываться в файле. Всё от этого зависит.
Jeev@s
2 / 2 / 0
Регистрация: 13.11.2012
Сообщений: 21
11.06.2013, 17:36  [ТС]     Исправить косяк в программе #11
Пользователь вводит данные в текстовый файл, с которым работает программа. С клавиатуры.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.06.2013, 17:38     Исправить косяк в программе #12
Цитата Сообщение от Jeev@s Посмотреть сообщение
Пользователь вводит данные в текстовый файл, с которым работает программа. С клавиатуры.
Цитата Сообщение от alsav22 Посмотреть сообщение
Покажите каким способом.
С клавиатуры куда вводите?
chizz
980 / 494 / 54
Регистрация: 19.03.2013
Сообщений: 3,084
Записей в блоге: 18
Завершенные тесты: 1
11.06.2013, 18:47     Исправить косяк в программе #13
Если сделать так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
       
        while (f>>buff)
        {
                        
               if (f.fail())
                {
                        cout<<"Ошибка чтения!"<<"\n" 
                            <<"Найден недопустимый символ в элементе с порядковым номером: "<< n + 1<<"\n"
                            <<"Дальнейшее выполнение программы прервано. Исправьте файл."<<"\n"
                            <<"Нажмите любую клавишу для выхода...";
                        _getch();
                        return -1;
                }
          n++;
     }
То, он будет выдавать правильный результат и при "1" и при "1 " в файле.

Но этот код никогда не будет возвращать ошибку, если найдена не цифра. Потому что f>>buff не выполняется, если найдено не число. А в результате он в любом случае ставит f.fail() в true. Поэтому проверка f.fail не работает.

Поэтому для того, чтобы определить в каком месте не число, надо придумать другую проверку. Либо полностью менять алгоритм.

Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
С клавиатуры куда вводите?
alsav22, я-пользователь, создаю в блокноте файл test.txt, пишу там 1, нажимаю сохранить. Запускаю данную программу, а она мне выдает - файл пустой.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.06.2013, 18:54     Исправить косяк в программе #14
chizz, если выдумавать, то никакой код не будет работать. Нет универсального кода, который может корректно обрабатывать файлы любого формата. Всегда есть ограничение на содержание и формат данных в файле. Всё делается под конкретную задачу. Если создаёте файл с помощью блокнота, то и открывайте его блокнотом. При чём здесь код ТС? ТС пишет, что он вводит данные с консоли, а не пишет в блокноте. Если это так, то всё остальное завист от него. Как хочет, так и запишет в файл.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.06.2013, 18:57     Исправить косяк в программе
Еще ссылки по теме:

Исправить ошибки в программе на С++ - C++
#include &lt;iostream&gt; #include &lt;algorithm&gt; #include &lt;vector&gt; using namespace std; class Comp { public: boolean...

Исправить ошибку в программе - C++
Друзья, помогите с программой, точнее, помогите её исправить. Программа должна искать числа палиндромы на заданном интервале. Но, она...

Исправить ошибки в программе - C++
Вот задача такая нужно прочитать из файла число прибавить к нему один и записать полученную суму обратно в этот же файл.Вот как я это...

Исправить ошибки в программе C++ - C++
База данных есть некоторые ошибки не могу исправить... #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include...


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

Или воспользуйтесь поиском по форуму:
chizz
980 / 494 / 54
Регистрация: 19.03.2013
Сообщений: 3,084
Записей в блоге: 18
Завершенные тесты: 1
11.06.2013, 18:57     Исправить косяк в программе #15
ЗЫ. Допустим, если в файле будет "1 d 3", то программа вернет, что элементов 1. А их по идее 2.

Если есть такой вариант развития событий, то с помощью f>>buff это не решить. Он всегда будет падать на d.
Тогда нужно считывать в строку и парсить строку.

Добавлено через 59 секунд
Цитата Сообщение от alsav22 Посмотреть сообщение
Как хочет, так и запишет в файл.
Есть такое понятие как пользователь

Пользователь обыкновениус имеет свойство писать что угодно и куда угодно, что бы ему не говорили и какие инструкции не писали.
Yandex
Объявления
11.06.2013, 18:57     Исправить косяк в программе
Ответ Создать тему
Опции темы

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