2 / 2 / 0
Регистрация: 13.11.2012
Сообщений: 21
1

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

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

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

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;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.06.2013, 02:28
Ответы с готовыми решениями:

Где косяк в коде и как исправить?
#include &lt;iostream&gt; using namespace std; int main() { setlocale (LC_CTYPE, &quot;Russian&quot;);...

косяк в программе. как исправить?
Вот код программы. все работает отлично, только гогда запускаю появляется окно (ошибка), а считает...

Перегрев процессора косяк мамки как исправить ?
Перегрев процессора из за неправильного напряжения процессора в биосе напряжение нормальное а на...

написать коментарии к программе и исправить ошибку в одной программе
и впрграмме mass нужно найти ошибку

19
5498 / 4893 / 831
Регистрация: 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;
0
2 / 2 / 0
Регистрация: 13.11.2012
Сообщений: 21
06.06.2013, 09:09  [ТС] 3
Ну и в таком случае выводит то же самое.
0
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 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
0
5498 / 4893 / 831
Регистрация: 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;
}
Миниатюры
Исправить косяк в программе   Исправить косяк в программе  
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
06.06.2013, 16:03 6
Если же вас интересует вопрос: как сделать правильный подсчёт чисел в файле, если неизвестно, что стоит после последнего числа в файле, то сразу возникает встречный вопрос: как создаётся такой файл с числами? Если с помощью записи чисел в файл через пробел, то после каждого числа в файле будет пробел и зачем тогда голову ломать над первым вопросом?
0
2 / 2 / 0
Регистрация: 13.11.2012
Сообщений: 21
11.06.2013, 02:40  [ТС] 7
Да, нужен правильный подсчет. Проблема была в том, что если в файле одно число, программа выдает, что файл пуст. Но если после этого числа вписать еще пробел, то программа выдает правильное сообщение (элемент один).
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
11.06.2013, 04:25 8
Вопрос остался без ответа.
Цитата Сообщение от alsav22 Посмотреть сообщение
сразу возникает встречный вопрос: как создаётся такой файл с числами? Если с помощью записи чисел в файл через пробел, то после каждого числа в файле будет пробел и зачем тогда голову ломать над первым вопросом?
0
2 / 2 / 0
Регистрация: 13.11.2012
Сообщений: 21
11.06.2013, 12:38  [ТС] 9
Так. Пользователь записывает в файл числа. Но он может ввести всего одно число и не поставить после него пробел. Конец файла будет сразу "впритык" за этим числом. Тогда программа считает ошибочно количество элементов.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
11.06.2013, 17:28 10
Цитата Сообщение от Jeev@s Посмотреть сообщение
Пользователь записывает в файл числа.
Покажите каким способом. Пользователь не может ничего записывать в файл. Пользователь может вводить числа, допустим, с консоли в программу. Если числа вводятся в числовую переменную, то никакого пробела после числа быть не может. Остальное делает программа. Как она написана, так числа и будут записываться в файле. Всё от этого зависит.
0
2 / 2 / 0
Регистрация: 13.11.2012
Сообщений: 21
11.06.2013, 17:36  [ТС] 11
Пользователь вводит данные в текстовый файл, с которым работает программа. С клавиатуры.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
11.06.2013, 17:38 12
Цитата Сообщение от Jeev@s Посмотреть сообщение
Пользователь вводит данные в текстовый файл, с которым работает программа. С клавиатуры.
Цитата Сообщение от alsav22 Посмотреть сообщение
Покажите каким способом.
С клавиатуры куда вводите?
0
993 / 521 / 102
Регистрация: 19.03.2013
Сообщений: 3,114
Записей в блоге: 19
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, нажимаю сохранить. Запускаю данную программу, а она мне выдает - файл пустой.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
11.06.2013, 18:54 14
chizz, если выдумавать, то никакой код не будет работать. Нет универсального кода, который может корректно обрабатывать файлы любого формата. Всегда есть ограничение на содержание и формат данных в файле. Всё делается под конкретную задачу. Если создаёте файл с помощью блокнота, то и открывайте его блокнотом. При чём здесь код ТС? ТС пишет, что он вводит данные с консоли, а не пишет в блокноте. Если это так, то всё остальное завист от него. Как хочет, так и запишет в файл.
0
993 / 521 / 102
Регистрация: 19.03.2013
Сообщений: 3,114
Записей в блоге: 19
11.06.2013, 18:57 15
ЗЫ. Допустим, если в файле будет "1 d 3", то программа вернет, что элементов 1. А их по идее 2.

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

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

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

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

Добавлено через 3 минуты
Хорошо. Пустой файл он тоже правильно определяет? И как тогда сделать проверку на корректность символов (т.к. (fail) отпадает)?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
12.06.2013, 20:14 18
Цитата Сообщение от Jeev@s Посмотреть сообщение
Пользователь с клавиатуры вводит числа в простой текстовый файл
Ещё раз (последний). С клавиатуры числа в файл не вводятся. Покажите код, где это происходи, тогда можно будет ответить на вопрос:
Цитата Сообщение от Jeev@s Посмотреть сообщение
Как это сделать?
0
2 / 2 / 0
Регистрация: 13.11.2012
Сообщений: 21
12.06.2013, 20:47  [ТС] 19
Вы можете предложить какую-нибудь проверку на "в каком месте не число"? Вместо fail.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
12.06.2013, 21:07 20
Могу предложить поиск по форуму. Тем таких - море.
0
12.06.2013, 21:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.06.2013, 21:07
Помогаю со студенческими работами здесь

Исправить исключение в программе
Всем привет, подскажите как в с# сделать исключение в программе чтобы не выбивала ошибку? т.е....

Исправить ошибку в программе
program Lab3_3; var N, k, Summa: integer; begin writeln ('Лабораторная работа № 3,...

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

Исправить ошибки в программе
помогите решить задачкууу!!! Program Prim; Var n,p:Integer; y:Real; Begin: p:=1; ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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