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

работа с файлами в С/C++ - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ массивы http://www.cyberforum.ru/cpp-beginners/thread105797.html
Заданы две таблицы. Одна cодержит наименование услуг, а другая – расценки за эти услуги. Удалите из обеих таблиц все, что предшествует услуге, цена которой P рублей. Дан одномерный массив из 10...
C++ Количество элементов массива У меня есть функция, в которой я создаю массив char. Мне нужно сделать так, чтобы кол-во элементов массива зависело от значения другой переменной (int). К примеру function (int a) { char... http://www.cyberforum.ru/cpp-beginners/thread105766.html
Возвращающееся значение. C++
Если у меня функция возвращает указатель на начало char массива (имя массива), то как она должна в заголовке обзываться: char function() или char* function() ?
C++ Найти номер ее столбца с наименьшим произведением элементов
Помогите пожалуйста с исходным кодом, как решить на языке программирования С++... Matrix26. Дана матрица размера M × N. Найти номер ее столбца с наименьшим произведением элементов и вывести данный...
C++ графика C++ http://www.cyberforum.ru/cpp-beginners/thread105727.html
Добрый день! Народ, такая проблема: мне нужно что-то нарисовать в C++, но #include <graphics.h> не работает - он ее не находит, пишет, что библиотека не найдена! Что мне делать, какие библиотеки C++...
C++ Указатели Условие: P1 - float; P2 - long; P3 - double; AB - (abs(p3))^1/p2 Подскажите, почему выдаёт ошибку Cannot convert 'double *' to 'float *'? в коде: #include <stdio.h> #include <conio.h>... подробнее

Показать сообщение отдельно
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
19.03.2010, 05:51
набросок, теперь с пояснениями

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
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#include <assert.h>
 
struct value {
    int field;
    char value[30];
    int quant;
};
/* для подсчитанных значений */
 
char **ReadFile(const char *);
char *DupLine(const char *);
struct value *CountValues(const char **);
void PrintValues(struct value *);
 
/* считает значения в строках файла
   и выводит статистику;
   
   нужен файл file.txt в котором 1000 строк
   в каждой числа "34335.03211 32549 26458 -786 65"
*/
int main(void) /* ANSI C89 */
{
    char **lines;
    struct value *values;
    
    
    lines = ReadFile("file.txt");
    
    if (lines == NULL)
        assert(0 && "read lines");
    /* прочитали файл */
    
    
    values = CountValues((const char **) lines);
    
    if (values == NULL)
        assert(0 && "count values");
    /* посчитали значения */
    
    {
        int i;
        
        for (i = 0; i < 1000; i++)
            free(lines[i]);
            /* каждую строку удаляем из памяти */
    }
    /* блок нужен для i
       количество строк задаётся вручную
       всё временно */
    
    free(lines);
    /* строки из файла больше не нужны */
    
    
    PrintValues(values);
    /* вывели значения */
    
    free(values);
    /* освободили память из под значений */
    
    
    exit(EXIT_SUCCESS);
}
 
char **ReadFile(const char *file)
{
    FILE *ifp;
    char **lines, *oneline;
    /* внутренние данные функции, после отработки они не нужны */
    
    const int n = 1000;
    /* это будет ожидаться снаружи
       возможно прототип изменится на что-нибудь, вроде
       char **ReadFile(const char *file, int n) */
    
    enum { MAXLINE = 1000 };
    int i;
    /* внутренние данные функции */
    
    
    ifp = fopen(file, "r");
    
    if (ifp == NULL)
        assert(0 && "open file");
    /* открыли файл */    
    
    
    lines = (char **) malloc(n*sizeof(char *));
    
    if (lines == NULL)
        assert(0 && "allocate lines");
    /* приготовили место для строк
       оно будет возвращено из функции */
    
 
    oneline = (char *) malloc(MAXLINE);
    
    if (oneline == NULL)
        assert(0 && "allocate one line");
    /* место для одной строки
       оно удалится после обработки */
    
    
    for (i = 0; i < n; i++) {
 
        char *readline;
        
        readline = fgets(oneline, MAXLINE, ifp);
 
        if (readline == NULL)
            assert(0 && "read one line");
        /* прочитали очередную строку */
        
        lines[i] = DupLine(readline);
        /* продублировали её в память
           сохранили в массиве строк
           чтобы потом вернуть его наружу */
        
        if (lines[i] == NULL)
            assert(0 && "duplicate one line");
        /* хватило памяти на строку ? проверили */
 
        /* дальше пошли */
    }
    /* после этого у нас есть массив указателей на строки
       заполненный указателями на строки
       всё в памяти - и массив указателей и строки */
    
    
    /* функция огромная, потому что это, можно сказать, модуль целый */
    
    
    free(oneline);
    /* удалили строку, которую юзали для дублирования */
    
    fclose(ifp);
    /* файл обработан - значит больше не нужен */
       
    
    return lines;
    /* строки возвращаем наружу */
}
 
/* DupLine:  создаёт копию строки в памяти */
char *DupLine(const char *line)
{
    char *newline;
    
    newline = (char *) malloc(strlen(line)+1);
    
    if (newline == NULL)
        return newline;
    
    strcpy(newline, line);
    
    return newline;
}
 
/* CountValues:  подсчитывает значения */
struct value *CountValues(const char **lines)
{
    struct value *values;
    /* значения будут посчитаны и возвращены */
    
    const int nv = 100;
    /* это число получится здесь */
    
    values = (struct value *) malloc(nv*sizeof(struct value));
 
    if (values == NULL)
        assert(0 && "allocate values");
    /* выделили место под значения
       под уже подсчитанные значения
       (как будто они уже есть) */
    
    
#if 1        
    values[0].field = 1;
    strcpy(values[0].value, "34335.09067");
    values[0].quant = 4;
    
    values[1].field = 1;
    strcpy(values[1].value, "34335.76734");
    values[1].quant = 2;
    
    values[2].field = 2;
    strcpy(values[2].value, "32549");
    values[2].quant = 128;
 
    values[3].field = 4;
    strcpy(values[3].value, "-886");
    values[3].quant = 3;
   
    /* ... */
 
#endif
    /* заполнили некоторые значения
       (будто они заполнились сами) */
 
    
    /* с этого места начинается программа */
 
    /* заполненное вручную удаляется,
       а вместо него подключается чтение */
    
    /* вернуть надо подсчитанные значения
       и их количество */
    
    return values;
}
 
/* PrintValues:  выводит значения */
void PrintValues(struct value *values)
{
    const int nv = 10; /* 100; */
    /* это подаётся снаружи
       подавать можно разными способами,
       поэтому это, пока что, в таком виде */
    
    int i;
    /* внутренняя */
    
    for (i = 0; i < nv; i++)
        printf("value: %15s, field: %d, quantity: %4d" "\n",
            (values+i)->value, (values+i)->field,
            (values+i)->quant);
    /* из массива значений выводится каждое значение
       формат и порядок задаётся любой */
}
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru