Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 1
Регистрация: 24.10.2016
Сообщений: 43
1

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

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

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

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

Считывание массива из файла с плавающей точкой
есть файл с матрицей: -5 4.4 5 1 2 3 3 2 1 имею код: int mas; FILE *ptrfile_ampl;...

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

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

11
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
27.03.2017, 16:58 2
del
0
0 / 0 / 1
Регистрация: 24.10.2016
Сообщений: 43
27.03.2017, 17:51  [ТС] 3
shvyrevvg, что вы имели ввиду?
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
27.03.2017, 17:58 4
C
1
mass = (float*)malloc(k * sizeof(float));
Чему равна переменная k? Что-то я не вижу где она инициализируется.

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

Добавлено через 1 минуту
А в какой строке вылетает программа, если посмотреть отладчиком?
1
0 / 0 / 1
Регистрация: 24.10.2016
Сообщений: 43
27.03.2017, 18:12  [ТС] 5
likehood, к- кол-во эл-ов в массиве ( 1 строчка в файле)
Так вот, он записывает в файл сколько эл-тов, а дальше вылетает ( по идеи дальше происходит запись эл-тов массива в файл, а следом то, что нужно сделать по заданию)
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
27.03.2017, 18:13 6
Цитата Сообщение от tujh48 Посмотреть сообщение
а дальше вылетает
Номер строки, в которой вылетает?
1
0 / 0 / 1
Регистрация: 24.10.2016
Сообщений: 43
27.03.2017, 18:20  [ТС] 7
likehood,как только заходит в цикл и считывает первый эл-т ( 151 строка), происходит ошибка
Миниатюры
Считывание массива из файла  
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
27.03.2017, 18:24 8
tujh48, вы сначала в массив пишите, а потом память для него выделяете.

Не по теме:

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



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

( глобальные переменные- это да, чет я вообще, исправлюсь)
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
27.03.2017, 18:30 10
Цитата Сообщение от shvyrevvg Посмотреть сообщение
вы сначала в массив пишите, а потом память для него выделяете.
Так и есть. Надо строку 113 перенести в функцию mas. А вообще, глобальные переменные - зло!
1
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
27.03.2017, 18:32 11
Лучший ответ Сообщение было отмечено tujh48 как решение

Решение

tujh48, ну так у вас вместо k, там уже N.
1
0 / 0 / 1
Регистрация: 24.10.2016
Сообщений: 43
27.03.2017, 18:37  [ТС] 12
shvyrevvg, спасибо, дошло, наконец-то я спокоен
0
27.03.2017, 18:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.03.2017, 18:37
Помогаю со студенческими работами здесь

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

Считывание элементов массива из файла, где в первой строке можно задавать размерность массива
Разработать программу для работы с одномерным массивом. Ее функции: - считывание элементов...

Запись массива в файл и считывание массива из файла
Здравствуйте. В общем в программировании я полный ноль,а курсовую сдавать все-таки надо-нашел...

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


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

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