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

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

Восстановить пароль Регистрация
 
Jeev@s
2 / 2 / 0
Регистрация: 13.11.2012
Сообщений: 21
06.06.2013, 02:28     Исправить косяк в программе #1
Ребят, есть программа, работающая с текстовым файлом (потоковый ввод-вывод). Если в файле имеется один символ (корректный-цифра), программа выводит сообщение, что файл пуст, однако, если добавить в конец пробел, выдает, что символ один. Как это исправить? Чтобы выводилось правильное определение количества элементов. Можно это сделать средствами работы с потоками?

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++ Исправить ошибки в программе
C++ Исправить ошибку в программе.
Исправить ошибку в программе C++
Исправить ошибки в программе на С++ C++
Исправить ошибки в программе C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 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
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 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
5282 / 4801 / 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
5282 / 4801 / 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
5282 / 4801 / 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
5282 / 4801 / 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
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.06.2013, 17:38     Исправить косяк в программе #12
Цитата Сообщение от Jeev@s Посмотреть сообщение
Пользователь вводит данные в текстовый файл, с которым работает программа. С клавиатуры.
Цитата Сообщение от alsav22 Посмотреть сообщение
Покажите каким способом.
С клавиатуры куда вводите?
chizz
 Аватар для chizz
975 / 489 / 54
Регистрация: 19.03.2013
Сообщений: 3,047
Записей в блоге: 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
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.06.2013, 18:54     Исправить косяк в программе #14
chizz, если выдумавать, то никакой код не будет работать. Нет универсального кода, который может корректно обрабатывать файлы любого формата. Всегда есть ограничение на содержание и формат данных в файле. Всё делается под конкретную задачу. Если создаёте файл с помощью блокнота, то и открывайте его блокнотом. При чём здесь код ТС? ТС пишет, что он вводит данные с консоли, а не пишет в блокноте. Если это так, то всё остальное завист от него. Как хочет, так и запишет в файл.
chizz
 Аватар для chizz
975 / 489 / 54
Регистрация: 19.03.2013
Сообщений: 3,047
Записей в блоге: 18
Завершенные тесты: 1
11.06.2013, 18:57     Исправить косяк в программе #15
ЗЫ. Допустим, если в файле будет "1 d 3", то программа вернет, что элементов 1. А их по идее 2.

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

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

Пользователь обыкновениус имеет свойство писать что угодно и куда угодно, что бы ему не говорили и какие инструкции не писали.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.06.2013, 19:08     Исправить косяк в программе #16
Цитата Сообщение от chizz Посмотреть сообщение
Есть такое понятие как пользователь
Ещё раз.

Цитата Сообщение от alsav22 Посмотреть сообщение
Нет универсального кода, который может корректно обрабатывать файлы любого формата. Всегда есть ограничение на содержание и формат данных в файле. Всё делается под конкретную задачу.
Jeev@s
2 / 2 / 0
Регистрация: 13.11.2012
Сообщений: 21
12.06.2013, 15:45  [ТС]     Исправить косяк в программе #17
Пользователь с клавиатуры вводит числа в простой текстовый файл, с которым потом работает программа. Он может ввести всего одно число, сохранить и закрыть файл. А может после этого единственного числа влепить еще и пробел. Здесь и возникает проблема с подсчетом (из-за пробела). По идее это исправляется в цикле while чуть ли не в одну строчку (связано с состоянием потока). Если немного изменить что-то в цикле, подсчет будет корректным. Как это сделать?

Добавлено через 3 минуты
Хорошо. Пустой файл он тоже правильно определяет? И как тогда сделать проверку на корректность символов (т.к. (fail) отпадает)?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.06.2013, 20:14     Исправить косяк в программе #18
Цитата Сообщение от Jeev@s Посмотреть сообщение
Пользователь с клавиатуры вводит числа в простой текстовый файл
Ещё раз (последний). С клавиатуры числа в файл не вводятся. Покажите код, где это происходи, тогда можно будет ответить на вопрос:
Цитата Сообщение от Jeev@s Посмотреть сообщение
Как это сделать?
Jeev@s
2 / 2 / 0
Регистрация: 13.11.2012
Сообщений: 21
12.06.2013, 20:47  [ТС]     Исправить косяк в программе #19
Вы можете предложить какую-нибудь проверку на "в каком месте не число"? Вместо fail.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.06.2013, 21:07     Исправить косяк в программе
Еще ссылки по теме:

C++ Исправить ошибку в программе
C++ Где косяк в коде и как исправить?
Исправить ошибку в программе C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.06.2013, 21:07     Исправить косяк в программе #20
Могу предложить поиск по форуму. Тем таких - море.
Yandex
Объявления
12.06.2013, 21:07     Исправить косяк в программе
Ответ Создать тему
Опции темы

Текущее время: 23:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru