Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
tujh48
0 / 0 / 1
Регистрация: 24.10.2016
Сообщений: 43
1

Считывание массива из файла

27.03.2017, 16:47. Просмотров 930. Ответов 11
Метки нет (Все метки)

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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
#include <stdio.h> 
#include <malloc.h> 
#include <conio.h> 
#include <locale.h> 
#include <stdlib.h> 
#include <time.h> 
 
 
float mas(FILE*in, FILE*out);
void InsertionSort(int n, float mass[]);
float linpoisk(float mass[], int N);
 
#define BORDER_HIGH 100 
#define BORDER_LOW -100 
 
int k;
int inenull;
float* mass;
int i;
 
FILE *in;
FILE *out;
float* i_find;
char fname[20] = "output.dat";
 
int main()
{
    float mas(FILE*in, FILE*out), A;
    setlocale(LC_ALL, "RUS");
    int N;
    int a;
    
    while (2) {
        printf("Какую задачу решить? \n 1)массив неупорядочен, найти сумму эл-тов, которые следуют за минимальным эл-том\n 2)упорядочен массив, вывести номера эл-тов, меньше заданного числа\n 3)считать с файла массив и сохранить в файл номера эл-тов меньше заданного числа\n 4)1 только через считывание из файла\n 5)выход\n");
        scanf_s("%ld", &a);
        switch (a)
 
        {
 
        case 1:
            printf("Введите кол-во эл-тов массива: ");
            scanf_s("%d", &N);
            mass = (float*)malloc(N * sizeof(float));
            srand((unsigned int)(time(NULL)));
            printf("Заполните массив элементами:\n");
 
            for (i = 0; i < N; i++)
            {
                mass[i] = BORDER_LOW + (BORDER_HIGH - BORDER_LOW)*((float)rand() / RAND_MAX);
 
                printf("a[%d] = %.3f\n", i, mass[i]);
            }
            printf("Сумма равна : %lf \n", linpoisk(mass, N));
            free(mass); // освобождение памяти 
 
            system("pause"); break;
 
        case 2:
 
            printf("Введите кол-во эл-тов массива: ");
            scanf_s("%d", &N);
            mass = (float*)malloc(N * sizeof(float));
            srand((unsigned int)(time(NULL)));
            printf("Заполните массив элементами:\n");
 
            for (i = 0; i < N; i++)
            {
                mass[i] = BORDER_LOW + (BORDER_HIGH - BORDER_LOW)*((float)rand() / RAND_MAX);
 
                printf("a[%d] = %.3f\n", i, mass[i]);
            }
            printf("Введите число, чтобы вывести номера эл-тов меньше этого числа\n");
            scanf_s("%f", &A);
 
            InsertionSort(N, mass);
            printf("Cортируем массив:\n");
            for (int i = 0; i < N; i++)
                printf("a[%d] = %.3f\n", i, mass[i]);
            printf("\n");
 
            printf("Номера элеметов, которые меньше заданного числа:\n");
            i_find = (float*)malloc(N * sizeof(float));
            for (int i = 0; i < N; i++) {
                if (mass[i] < A) {
                    i_find[i] = (float)i;
                    printf("%.f \n", i_find[i]);
                }
                else printf(" ");
            }
 
            system("pause"); break;
        case 3:
 
            setlocale(LC_ALL, "RUS");
            puts("Чтение из файла");
            if (!(in = fopen("input.txt", "rt")))
            {
                printf("Ошибка открытия файла");
                system("pause");
            }
            puts("Запись в файла");
            if (!(out = fopen("output.dat", "wt")))
            {
                printf("Ошибка открытия файла");
                system("pause");
            }
            printf("Введите число, чтобы вывести номера эл-тов меньше этого числа\n");
            scanf_s("%f", &A);
        
            while (!feof(in))
            {
                mas(in, out);
                mass = (float*)malloc(k * sizeof(float));
                InsertionSort(k, mass);
                fprintf(out, "Cортируем массив:\n");
                for (int i = 0; i < k; i++)
                    fprintf(out, "a[%d] = %.3f\n", i, mass[i]);
                printf("\n");
                fprintf(out, "Номера элеметов, которые меньше заданного числа:\n");
                i_find = (float*)malloc(k * sizeof(float));
                for (int i = 0; i < k; i++) {
                    if (mass[i] < A) {
                        i_find[i] = (float)i;
                        fprintf(out, "%.f \n", i_find[i]);
                    }
                    else printf(" ");
                }
 
            }
            fclose(in);
            fclose(out);
            system("pause");  break;
            
        case 4: //////////////////////////////////////// 
            setlocale(LC_ALL, "RUS");
            puts("Чтение из файла");
            if (!(in = fopen("input.txt", "rt")))
            {
                printf("Ошибка открытия файла");
                system("pause");
            }
            puts("Запись в файла");
            if (!(out = fopen("output.dat", "wt")))
            {
                printf("Ошибка открытия файла");
                system("pause");
            }
        
            while (!feof(in))
            {
                mas(in, out);
                mass = (float*)malloc(k * sizeof(float));
 
            }
 
            fprintf(out, "Сумма равна : %lf \n", linpoisk(mass, N));
 
            fclose(in);
            fclose(out);
            system("pause");
                //////////////////////////////////////// 
            break;
        case 5: exit(5); break;
        default:
            break;
        }
        system("pause");
    }
}
 
float linpoisk(float mass[], int N)
{
    int i_find;
    float sum = 0;
    i_find = 0;
    for (int i = 1; i < N; i++)
    {
        if (mass[i_find] > mass[i])
            i_find = i;
    }
      printf("Номер минимального эл-та массива: %d \n", i_find);
    for (int i = i_find + 1; i < N; i++)
    {
        sum += mass[i];
    }
    return sum;
}
 
void InsertionSort(int n, float mass[])
{
    float newElement;
    int location;
 
    for (int i = 1; i < n; i++)
    {
        newElement = mass[i];
        location = i - 1;
        while (location >= 0 && mass[location] > newElement)
        {
            mass[location + 1] = mass[location];
            location = location - 1;
        }
        mass[location + 1] = newElement;
    }
}
 
float mas(FILE*in, FILE*out)
{
    fscanf(in, "%d", &k);
    fprintf(out, "Кол-во эл-тов %d \n", k);
 
    for (int i = 0; i < k; i++)
    {
        fscanf(in, "%f", &mass[i]);
        fprintf(out, "a[%d] = %6.2f\n", i, mass[i]);
    }
 
}
Нужно с файла считать массив, поработать с ним, и результат записать в др файл ( в коде кейсы 3 и 4)
Так вот при работе с файлом происходят неполадки ( см. скриншот), как исправить- мозг не доходит уже 3 сутки
0
Миниатюры
Считывание массива из файла  
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2017, 16:47
Ответы с готовыми решениями:

Считывание массива из файла
Нужно считать из текстового файла двумерный массив, заполненный целыми...

Считывание массива чисел с экспонентой из файла
Здравствуйте, помогите, пожалуйста, дан файл с такими числами(сначала...

Считывание двумерного массива с разным количеством элементов в строках из файла
Дан файл из n строк. В каждой строке записаны через пробел некоторое количество...

Выполнить считывание и заполнение массива строк из заданного текстового файла
Реализовать работу с массивом строк: a. Выполнить считывание и заполнение...

Считывание из файла
Здравствуйте. Возникла проблема, что файл считывается как пустой, хоть это и не...

11
shvyrevvg
725 / 541 / 270
Регистрация: 12.05.2016
Сообщений: 1,572
27.03.2017, 16:58 2
del
0
tujh48
0 / 0 / 1
Регистрация: 24.10.2016
Сообщений: 43
27.03.2017, 17:51  [ТС] 3
shvyrevvg, что вы имели ввиду?
0
likehood
984 / 828 / 396
Регистрация: 25.12.2016
Сообщений: 2,727
Завершенные тесты: 3
27.03.2017, 17:58 4
C
1
mass = (float*)malloc(k * sizeof(float));
Чему равна переменная k? Что-то я не вижу где она инициализируется.

Добавлено через 2 минуты
Теперь вижу, в функции mas. Вообще, использование глобальных переменных, особенно с такими короткими именами - не самая хорошая идея.

Добавлено через 1 минуту
А в какой строке вылетает программа, если посмотреть отладчиком?
1
tujh48
0 / 0 / 1
Регистрация: 24.10.2016
Сообщений: 43
27.03.2017, 18:12  [ТС] 5
likehood, к- кол-во эл-ов в массиве ( 1 строчка в файле)
Так вот, он записывает в файл сколько эл-тов, а дальше вылетает ( по идеи дальше происходит запись эл-тов массива в файл, а следом то, что нужно сделать по заданию)
0
likehood
984 / 828 / 396
Регистрация: 25.12.2016
Сообщений: 2,727
Завершенные тесты: 3
27.03.2017, 18:13 6
Цитата Сообщение от tujh48 Посмотреть сообщение
а дальше вылетает
Номер строки, в которой вылетает?
1
tujh48
0 / 0 / 1
Регистрация: 24.10.2016
Сообщений: 43
27.03.2017, 18:20  [ТС] 7
likehood,как только заходит в цикл и считывает первый эл-т ( 151 строка), происходит ошибка
0
Миниатюры
Считывание массива из файла  
shvyrevvg
725 / 541 / 270
Регистрация: 12.05.2016
Сообщений: 1,572
27.03.2017, 18:24 8
tujh48, вы сначала в массив пишите, а потом память для него выделяете.

Не по теме:

За глобальные переменные руки бы оторвать... :)



Добавлено через 44 секунды
Цитата Сообщение от tujh48 Посмотреть сообщение
shvyrevvg, что вы имели ввиду?
Да примерно тоже самое что
Цитата Сообщение от likehood Посмотреть сообщение
Чему равна переменная k? Что-то я не вижу где она инициализируется.
Добавлено через 2 минуты
Теперь вижу, в функции mas. Вообще, использование глобальных переменных, особенно с такими короткими именами - не самая хорошая идея.
Добавлено через 1 минуту
А в какой строке вылетает программа, если посмотреть отладчиком?
1
tujh48
0 / 0 / 1
Регистрация: 24.10.2016
Сообщений: 43
27.03.2017, 18:30  [ТС] 9
shvyrevvg, окей, я понял что нужно сначала выделить память, потом считать массив
ну а теперь ошибка вылезла в 156 строке, где в фпринтэфе вызывается функция для подсчета суммы

( глобальные переменные- это да, чет я вообще, исправлюсь)
0
likehood
984 / 828 / 396
Регистрация: 25.12.2016
Сообщений: 2,727
Завершенные тесты: 3
27.03.2017, 18:30 10
Цитата Сообщение от shvyrevvg Посмотреть сообщение
вы сначала в массив пишите, а потом память для него выделяете.
Так и есть. Надо строку 113 перенести в функцию mas. А вообще, глобальные переменные - зло!
1
shvyrevvg
725 / 541 / 270
Регистрация: 12.05.2016
Сообщений: 1,572
27.03.2017, 18:32 11
Лучший ответ Сообщение было отмечено tujh48 как решение

Решение

tujh48, ну так у вас вместо k, там уже N.
1
tujh48
0 / 0 / 1
Регистрация: 24.10.2016
Сообщений: 43
27.03.2017, 18:37  [ТС] 12
shvyrevvg, спасибо, дошло, наконец-то я спокоен
0
27.03.2017, 18:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2017, 18:37

Считывание чисел из файла
Помогите пожалуйста ,не могу решить задачу: Во входном файле записаны числа,...

Считывание из файла в структуру
структура вида название_фильма,стоимость,режиссер.Данные в файле.Как считать...

Считывание файла в буфер
Проблема заключается в том, что поблочное чтение файла просто считывает из него...


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

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

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