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

Обработка массива, считанного из файла; найти ошибку - C++

Восстановить пароль Регистрация
 
Монтгомери
0 / 0 / 0
Регистрация: 10.09.2013
Сообщений: 112
18.06.2014, 17:50     Обработка массива, считанного из файла; найти ошибку #1
Есть задание: программа считывает из файла массив целых чисел.
Найти максимум (max) и минимум (min) среди них, после чего найти среднее арифметическое отрицательных чисел, расположенных между max и min.

Написал такую программу:
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
#include <iostream>
#include <fstream>
using namespace std;
void main(void)
{int max,min,maxind=0,minind=0,i=0,n,m,dim,counter=0;
double s=0;
char *filename[64];
gets(filename);
ifstream input_file(filename);
ofstream output_file("C:\\temp\\result.txt");
char temp[11];
while(!input_file.eof())
{input_file>>temp;
++i;}
dim=i;
cout<<dim<<"\n";
if(dim==1){cout<<"Only one number in the file!";output_file<<"Result: 0";goto end;}
if(dim==2){cout<<"Only two numbers in the file!";output_file<<"Result: 0";goto end;}
int *num=new int[dim];
input_file.close();cout<<"Closed\n";
input_file.open(filename);cout<<"Opened\n";
input_file>>temp; 
num[0]=atoi(temp);cout<<num[0];
max=num[0];
min=num[0];
i=1;
while(!input_file.eof())
{input_file>>temp; 
num[i]=atoi(temp);cout<<num[i]<<"\n";
++i;}
for(i=0;i<dim;i++)
{if(num[i]>=max){max=num[i];maxind=i;}
if(num[i]<=min){min=num[i];minind=i;};}
cout<<"max="<<max<<"\nmin="<<min;
if(maxind>minind){m=maxind;n=minind+1;}
if(maxind<minind){n=maxind+1;m=minind;}
for(i=n;i<m;i++)
{if(num[i]<0)s=s+num[i];++counter;}
s=s/counter;
cout<<s;
output_file<<"Result: "<<s;
end: system("pause");}
Но появилось несколько проблем:

1. Программа выдаёт ошибку, когда доходит до gets

2. После замены
C++
1
2
char *filename[64];
gets(filename);
на
C++
1
char*filename="C:\\file.txt"
Показывает пустое чёрное окно с курсором и ни на что не реагирует.


1. Я думаю, что это из-за того, что часть массива filename осталось незаполненным. Но какой тогда способ использовать для ввода полного имени файла с клавиатуры?

2. Не представляю даже, что там не так. Но я наставил кучу cout для того, чтобы видеть, на каком этапе программа прервётся. Ни один cout не вывел ничего на экран, значит ошибка где-то ещё до них.

3. Ещё вопрос. Это:
C++
1
2
input_file>>temp; 
num[i]=atoi(temp)
можно ли заменить этим:
C++
1
input_file>>num[i];
Будет работать?

Заранее спасибо

2 исправил: просто проглупил и забыл файл создать.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
18.06.2014, 18:24     Обработка массива, считанного из файла; найти ошибку #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Монтгомери Посмотреть сообщение
char *filename[64];
gets(filename);
Звездочку уберите

Добавлено через 2 минуты
Цитата Сообщение от Монтгомери Посмотреть сообщение
input_file>>num[i];
Работать будет, но если во входном потоке не окажется цифр,
то возникнет ошибочное состояние. А atoi во что-нибудь да переведет (кажется в 0).
Монтгомери
0 / 0 / 0
Регистрация: 10.09.2013
Сообщений: 112
18.06.2014, 18:32  [ТС]     Обработка массива, считанного из файла; найти ошибку #3
Спасибо
LifeMoroz
11 / 11 / 3
Регистрация: 12.10.2013
Сообщений: 54
18.06.2014, 18:40     Обработка массива, считанного из файла; найти ошибку #4
C
1
2
char *filename[64];
gets(filename);
не правильно.
Сигнатура:
C
1
char * gets ( char * str );
Вы передаете указатель на массив, (аналог: char **str)
А надо указатель на блок памяти (просто указатель, char *str или char str[buffersize], не совсем одно и то же, но прокатит)
http://www.cplusplus.com/reference/cstdio/gets/

Зачем это?
C
1
2
input_file.close();cout<<"Closed\n";
input_file.open(filename);cout<<"Opened\n";

1. Я думаю, что это из-за того, что часть массива filename осталось незаполненным. Но какой тогда способ использовать для ввода полного имени файла с клавиатуры?
Прикладываю отформатированный код, мб кто-то сможет поймать багу.
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
#include <iostream>
#include <fstream>
 
using namespace std;
 
int main() {
    int max, min ,maxind = 0, minind = 0, i = 0, n, m, dim, counter = 0;
    double s = 0;
    char filename[64];
    gets(filename);
    ifstream input_file(filename);
    ofstream output_file("C:\\temp\\result.txt");
    char temp[11];
    while(!input_file.eof()) {
        input_file >> temp;
        ++i;
    }
    dim = i;
    cout << dim << "\n";
    
    if(dim == 1) {
        cout << "Only one number in the file!";
        output_file << "Result: 0";
    } 
    else if (dim == 2) {
        cout << "Only two numbers in the file!";
        output_file << "Result: 0";
        }
    else {
        int *num = new int[dim];
        input_file.close();
        cout << "Closed\n";
        input_file.open(filename);
        cout << "Opened\n";
        input_file >> temp; 
        num[0] = atoi(temp);
        cout << num[0];
        max = num[0];
        min = num[0];
        i = 1;
    
        while(!input_file.eof()) {
            input_file >> temp; 
            num[i] = atoi(temp);
            cout << num[i] << "\n";
            ++i;
            }
        
        for(i = 0; i < dim; i++) {
            if(num[i] >= max) {
                max=num[i];
                maxind=i;
            }
            if(num[i]<=min) {
                min=num[i];
                minind=i;
            };
        }
        cout << "max=" << max << "\nmin=" << min;
        
        if (maxind > minind) {
            m = maxind;
            n = minind + 1;
        }
        if (maxind < minind) {
            n = maxind + 1;
            m = minind;
        }
        // А если равно!?
        
        for(i = n; i < m; i++) {
            if(num[i] < 0)
                s=s+num[i];
            ++counter;
        }
        s = s/counter;
        cout << s;
        output_file << "Result: " << s;
    }
    system("pause");
}
P.s. не пишите так код пожалуйста, очень сложно читать, используйте отступы и не пишите 3 команды подряд, про goto вообще молчу, просто return нужно делать
Монтгомери
0 / 0 / 0
Регистрация: 10.09.2013
Сообщений: 112
18.06.2014, 19:07  [ТС]     Обработка массива, считанного из файла; найти ошибку #5
return будет тоже ждать нажатия любой клавиши? Если да, то от подходит, спасибо.

Добавлено через 5 минут
Цитата Сообщение от LifeMoroz Посмотреть сообщение
Зачем это?
Я думал, что после
C++
1
2
3
4
while(!input_file.eof()) {
        input_file >> temp;
        ++i;
    }
программа будет проболжать с последнего места чтения. А т.к. закончило оно на конце файла, то может выдать ошибку.
Если оно и без этого будет работать - удалю
Цитата Сообщение от LifeMoroz Посмотреть сообщение
// А если равно!?
А равно оно может быть в двух случая:
1. В файла всего одно число, это я раньше предусмотрел.
2. Файл состоит из множества одинаковых чисел (4 4 4 4 4 ...). Это уже маловероятно, хотя хорошо, всё же предусмотрю.

Добавлено через 11 минут
Цитата Сообщение от Монтгомери Посмотреть сообщение
Зачем это?
Проверил: убрал эти две строки. Без этого где-то выдаёт ошибку, а искать откровенно лень.
LifeMoroz
11 / 11 / 3
Регистрация: 12.10.2013
Сообщений: 54
18.06.2014, 19:17     Обработка массива, считанного из файла; найти ошибку #6
Проверил: убрал эти две строки. Без этого где-то выдаёт ошибку, а искать откровенно лень.
http://www.cplusplus.com/reference/i...istream/seekg/

file.seekg (0, is.beg)

return будет тоже ждать нажатия любой клавиши? Если да, то от подходит, спасибо.
Не будет, но макаронный код придет к вам ночью и замаринует (однажды), если будете использовать goto. Тот код что я скинул избегает goto и при этом ожидает
Единственно, в конце таки надо добавить return 0;
Функция main должна что-то возвращать по фен-шую
Yandex
Объявления
18.06.2014, 19:17     Обработка массива, считанного из файла; найти ошибку
Ответ Создать тему
Опции темы

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