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

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

Восстановить пароль Регистрация
 
DaNa88
 Аватар для DaNa88
0 / 0 / 0
Регистрация: 17.03.2010
Сообщений: 3
17.03.2010, 18:47     работа с файлами в С/C++ #1
Привет! Нужна помощь специалиста) Подскажите, пожалуйста, как из файла filename.txt, в котором содержится матрица из 1000 на 5, записать элементы в массивы M[n,1], M[n,2], M[n,3], M[n,4], M[n,5] и с каждым из них потом отдельно работать (задание-посчитать число значений в столбцах)?
\\как открыть файл понятно
C++
1
2
3
4
5
6
7
8
#include <stdio.h>
#include <errno.h>
FILE *f = fopen("filеnamе.txt", "rt");
if (f == NULL) {
    printf(
        "Ошибка открытия файла с кодом %d\n",
        errno
    );
\\подскажите, что дальше
Заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.03.2010, 18:47     работа с файлами в С/C++
Посмотрите здесь:

работа с файлами C++
Работа с файлами. C++
C++ Работа с файлами в C, C++
Работа с файлами C++
C++ Работа с файлами
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
17.03.2010, 19:29     работа с файлами в С/C++ #2
Дай файл filename.txt
DaNa88
 Аватар для DaNa88
0 / 0 / 0
Регистрация: 17.03.2010
Сообщений: 3
18.03.2010, 07:29  [ТС]     работа с файлами в С/C++ #3
файл filename.txt содержит в себе данные:
date.time
HTML5
1
&nbsp;&nbsp;&nbsp;
t X Y Z E
34335.03211 32549 26458 -786 65
34335.09067 32136 26995 -886 87
34335.10316 32102 26984 -1015 23
34335.14946 32772 26460 -839 190
34335.20647 33123 26728 -987 51
34335.43058 32849 26451 -735 89
34335.48520 32380 26756 -641 140
34335.76734 33040 26261 -802 220
34335.78130 32220 26922 -890 230
.
.
.
ниже ещё 991 строка с аналогичными данными

Добавлено через 18 минут
Цитата Сообщение от DaNa88 Посмотреть сообщение
date.time
HTML5
1
&nbsp;&nbsp;&nbsp;
t X Y Z E
здесь я пыталась увеличить расстояние между t,X,Y,Z,E (в файле несколько пробелов между этими символами) но у меня не получилось
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
18.03.2010, 07:48     работа с файлами в С/C++ #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int i = 0, m = 0, m1 = 0, *array;
char *s, **matrix;
while(!feof(f))
   s[i++] = getc(f);
 
for(int j = 0; j < i; j++){  
   while(s[j] != ' ')
      matrix[m][m1++] = s[j++];
   m++;
   m1 = 0;
}//теперь у нас есть массив строк, каждая из которых представляет из себя число в виде строки
 
for(i = 0; i < m; i++)
   array[i] = atoi(matrix[i]);//переводим строку цифр в число типа int и получаем массив чисел, ну и там как  угодно 
                              //можно его разбить на двумерный массив
есть функции, аналогичные atoi(), которые переводят строку в переменные типа float - atof(), long - atol(), long double - _atold();
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
18.03.2010, 11:05     работа с файлами в С/C++ #5
Код
[guest@station test]$ ./test
value:     34335.09067, field: 1, quantity:    4
value:     34335.76734, field: 1, quantity:    2
value:           32549, field: 2, quantity:  128
value:            -886, field: 4, quantity:    3
value:                , field: 0, quantity:    0
value:                , field: 0, quantity:    0
value:                , field: 0, quantity:    0
value:                , field: 0, quantity:    0
value:                , field: 0, quantity:    0
value:                , field: 0, quantity:    0
[guest@station test]$
набросок

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
#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 *);
 
/*  */
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]);
    }
    
    free(lines);
    
    
    PrintValues(values);
        
    free(values);
    
    
    exit(EXIT_SUCCESS);
}
 
char **ReadFile(const char *file)
{
    FILE *ifp;
    char **lines, *oneline;
    const int n = 1000;
    
    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;
}
 
char *DupLine(const char *line)
{
    char *newline;
    
    newline = (char *) malloc(strlen(line)+1);
    
    if (newline == NULL)
        return newline;
    
    strcpy(newline, line);
    
    return newline;
}
 
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");
    
        
    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;
   
    /* ... */
 
    
    return values;
}
 
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);
}


Добавлено через 8 минут
уматнее, конечно, разложить это на модули
и уже, когда строки есть, спокойно порезать их для подсчёта
DaNa88
 Аватар для DaNa88
0 / 0 / 0
Регистрация: 17.03.2010
Сообщений: 3
18.03.2010, 12:45  [ТС]     работа с файлами в С/C++ #6
accept, добавьте пожалуйста комментарии в Ваш набросок, совсем не могу разобраться с ним...
kirjushyk
60 / 22 / 2
Регистрация: 13.03.2010
Сообщений: 65
19.03.2010, 02:15     работа с файлами в С/C++ #7
А может быть как-то так...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main()
{
    int i, j;
    float m[1000][5];
    FILE *f;
    f = fopen("filename.txt", "r");
    for (i = 0; i < 1000; i++)
        for (j = 0; j < 5; j++)
            fscanf("%f", &m[i][j]);
    ...
    fclose(f);
    return 0;
}
Добавлено через 4 минуты
Написанный мною кусочек читает из файла 1000 строк по 5 числовых значений, в качестве разделителя - любое количество пробелов, табуляций, или переводов строк.
Vorona
Peace 2 all shining faces
 Аватар для Vorona
660 / 522 / 44
Регистрация: 05.03.2010
Сообщений: 1,256
19.03.2010, 03:06     работа с файлами в С/C++ #8
в начале ф-ции fscanf() в скобках f стоит дописать, как поток из которого считываем символы
совсем забыл про эту ф-цию....спасибо, что напомнил)
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
19.03.2010, 05:51     работа с файлами в С/C++ #9
набросок, теперь с пояснениями

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);
    /* из массива значений выводится каждое значение
       формат и порядок задаётся любой */
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.03.2010, 10:41     работа с файлами в С/C++
Еще ссылки по теме:

C++ Работа с файлами
Работа с файлами C++
C++ Работа с файлами

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

Или воспользуйтесь поиском по форуму:
kirjushyk
60 / 22 / 2
Регистрация: 13.03.2010
Сообщений: 65
19.03.2010, 10:41     работа с файлами в С/C++ #10
Ну да, я не проверял, такие ошибки в ходе компиляции выявляются =)
Yandex
Объявления
19.03.2010, 10:41     работа с файлами в С/C++
Ответ Создать тему
Опции темы

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