Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.92/12: Рейтинг темы: голосов - 12, средняя оценка - 4.92
1 / 1 / 0
Регистрация: 30.07.2012
Сообщений: 52
1

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

30.07.2012, 22:39. Просмотров 2466. Ответов 20
Метки нет (Все метки)

Ребят, помогите, пожалуйста, новичку разобраться=)
Есть файл, в котором расположена информация примерно такого содержания
1946 12 30 0 -519 0 -490 0 9999 9 0 2 0
1946 12 31 0 -528 0 -499 0 9999 9 0 2 0
1947 1 1 0 -477 0 -383 0 -366 0 1 0 0
1947 1 2 0 -406 0 -356 0 -335 0 5 0 0
1947 1 3 0 -481 0 -408 0 -373 0 0 2 0
Нужно считать информацию из файла 4 столбца(1-столбец год, второй-месяц-3-день и 8-температура). Причем если в 8 столбце стоит значение 9999, то строку не выписывать во второй файл. Затем надо посчитать и вывести среднее арифметическое температур по годам , т.е. среднюю температуруза 47 год, 48 и т.д. Подскажите, как?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.07.2012, 22:39
Ответы с готовыми решениями:

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

Считывание файла в массив и запись нового файла
Консоль VS C++. Текстовый файл открывается как бинарный, и считывается по 100 байт в массив - и...

Считывание файла
ВОбщем при считывании файла стандартными способами FILE *file = fopen(filename, "r"); ...

Считывание из файла
Дан файл с данными типа: Петров Роман 1989 04 15 5 4 3 5 естесственно, что данных больше.....

20
59 / 59 / 8
Регистрация: 15.10.2010
Сообщений: 356
30.07.2012, 23:08 2
Считываете число за числом, считая число считанных чисел. Пусть это число (число считанных чисел) равно n.
Берете остаток от деления этого n на число столбцов. Получаете конкретный индекс столбца.
В зависимости от этого номера, кладете в соответствующую ячейку структуры. Что то вроде
C++
1
2
3
4
5
6
struct S {
  int year;
  int month;
  int year;
  int t;
};
И кладете в массив или в вектор сформированную строку (когда n % 8 == 0). Получаете массив структур. Поиск среднего арифметического по годам - тривиально.

Дерзайте.
1
46 / 41 / 8
Регистрация: 06.09.2010
Сообщений: 419
30.07.2012, 23:10 3
Считываешь построчно и делаешь анализ строки.
Код за тебя писать никто не будет.
для анализа даты и прочего, разбираешь строку. ТО есть начиная от нуля до первого пробела - это год, дальше от проблел+1 до след пробела - это месяц и так далее анализируешь.
Если тебе не надо анализировать даты и прочее а нудно только находить 9999 то делаешь поиск по строке, если он вернул позицию - значит не выполняем запись. и так далее.
0
1 / 1 / 0
Регистрация: 30.07.2012
Сообщений: 52
31.07.2012, 01:27  [ТС] 4
Считываете число за числом, считая число считанных чисел. Пусть это число (число считанных чисел) равно n.
Берете остаток от деления этого n на число столбцов. Получаете конкретный индекс столбца.
В зависимости от этого номера, кладете в соответствующую ячейку структуры. Что то вроде
C++
1
2
3
4
5
6
struct S {
  int year;
  int month;
  int year;
  int t;
};
И кладете в массив или в вектор сформированную строку (когда n % 8 == 0). Получаете массив структур. Поиск среднего арифметического по годам - тривиально.



ТОгда такой вопрос. Вот мой код
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define MAXLEN 1024
 
int main(void)
{
    FILE *ifp;
   FILE *fout
    int i, maxline = 8;
    char **lines, **p, buf[MAXLEN];
 
    if( (ifp = fopen("U24763", "r")) == NULL) {
        perror("fopen");
        return 1;
    }
    if(fout = fopen("results"),"w"){
 
    }
 
    if( (lines = (char **) malloc(sizeof(char *) * maxline)) == NULL) {
        perror("malloc");
        return 1;
    }
    for(i = 0; ; i++) {
        if(i >= maxline) {
            maxline *= 2;
            if( (p = (char **) realloc(lines, sizeof(char *) * maxline)) == NULL) {
                perror("realloc");
                return 1;
            }
            lines = p;
        }
        if( (lines[i] = (char *) malloc(MAXLEN)) == NULL) {
            perror("malloc");
            return 1;
        }
        if(fgets(buf, sizeof(buf), ifp) == NULL)
            break;
        strcpy(lines[i], buf);
    }
    fclose(ifp);
    maxline = i + 1;
    for(i = 0; i < maxline; i++)
        printf("%s", lines[i]);
    fwrite("%s", lines[i]);
   fclose(fout);
    return 0;
}
При записывании из одного файла в другой выдает массу ошибок. Что я делаю неверно?
0
59 / 59 / 8
Регистрация: 15.10.2010
Сообщений: 356
31.07.2012, 01:51 5
Цитата Сообщение от kuziashagrath Посмотреть сообщение
for(i = 0; i < maxline; i++)
printf("%s", lines[i]);
fwrite("%s", lines[i]);
С ходу вижу только вот это.
i - необъявленный идентификатор.
Забыли где надо фигурные скобки.

В следующий раз используйте теги [ CPP ] [ / CPP ]

Ух как даже. Вы переопределили занова идентификатор. Не стоит так делать. Нечитабельно.

Добавлено через 10 минут
Быть может вот так будет по-лучше?
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define MAXLEN 1024
 
int main(void)
{
    FILE *ifp;
    FILE *fout
    int i, maxline = 8;
    char **lines, **p, buf[MAXLEN];
 
    if( (ifp = fopen("U24763", "r")) == NULL) {
        perror("fopen");
        return 1;
    }
    if(fout = fopen("results"),"w"){
 
    }
 
    if( (lines = (char **) malloc(sizeof(char *) * maxline)) == NULL) {
        perror("malloc");
        return 1;
    }
    for(i = 0; ; i++) {
        if(i >= maxline) {
            maxline *= 2;
            if( (p = (char **) realloc(lines, sizeof(char *) * maxline)) == NULL) {
                perror("realloc");
                return 1;
            }
        lines = p;
        }
        if( (lines[i] = (char *) malloc(MAXLEN)) == NULL) {
            perror("malloc");
            return 1;
        }
        if(fgets(buf, sizeof(buf), ifp) == NULL)
            break;
        strcpy(lines[i], buf);
    }
    fclose(ifp);
    maxline = i + 1;
    for(i = 0; i < maxline; i++)
        printf("%s", lines[i]);
    fwrite("%s", lines[i]);
    fclose(fout);
    return 0;
}
Добавлено через 8 минут
Документация к
C++
1
fwrite("%s", lines[i]);
Для чтения и записи данных, тип которых может занимать более 1 байта, в файловой системе языка С имеется две функции: fread() и fwrite(). Эти функции позволяют читать и записывать блоки данных любого типа. Их прототипы следующие:

C++
1
2
size_t fread(void *буфер, size_t колич_байт, size_t счетчик, FILE *уф);
size_t fwrite(const void *буфер, size_t колич_байт, size_t счетчик, FILE *уф);
Используйте fprintf();

Вот еще...
C++
1
maxline = i + 1;
После выделения для i-ой ячейки массива памяти, i - инкрементируется. Далее, maxline = i + 1; а далее - цикл по i до maxline. Последний элемент массива - не существует.
Аналогично для заведомо неверного fwrite.

К тому же, в файл вы пытаетесь записать только последнюю считанную строку. Имейте это в виду.

Добавлено через 1 минуту
Как то так. Невооруженным взглядом больше ошибок не видно.
0
Заблокирован
Автор FAQ
31.07.2012, 10:42 6
HomeR_J_SimpsoN, нельзя так читать это файл как ты предлагаешь - числа там записаны в текстовом формате, а fread читаем бинарку. Для данного задания следует использовать либо fscanf либо если пишем на плюсах то потоковый ввод ifstream >>
0
63 / 58 / 14
Регистрация: 14.12.2011
Сообщений: 193
31.07.2012, 10:54 7
C++
1
if(fout = fopen("results"),"w"){
Не понятно, но здорово..

Я б считывал всю строку и использовал
C++
1
int sscanf ( const char * str, const char * format, ...);
.
0
Заблокирован
Автор FAQ
31.07.2012, 11:08 8
Ниже код на Си по чтению и печати содержимого файла, как поступать с массивом структур это на ваше усмотрение
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
#include <stdio.h>
#include <stdlib.h>
 
//1946 12 30 0 -519 0 -490 0 9999 9 0 2 0
typedef struct
{
    int year;
    int month;
    int day;
    int param4;
    int param5;
    int param6;
    int param7;
    int param8;
    int param9;
    int param10;
    int param11;
    int param12;
    int t;
}FILE_DATA;
 
int main()
{
    int i;//Ñ÷¸ò÷èê
    int n = 0;//Áóäåò ñîäåðæàòü ÷èñëî ñèòàííûõ ñòðîê
    FILE_DATA * pList = NULL;//Óêàçàòåëü íà ìàññèâ ñòðóêòóð FILE_DATA
    FILE * file = fopen("input.txt","rb");//Èíèöèàëèçèðóåì ïîòîê ÷òåíèÿ
    if(file == NULL)
        printf("Error open input.txt\n");
    else
    {
        //Âûäåëÿåì ïàìÿòü ïîä ïåðâóþ ñòðóêòóðó ìàññèâà
        pList = (FILE_DATA *)malloc(sizeof(FILE_DATA));
        for(n = 0; !feof(file); )
        {
            //Ìàëî êòî çíàåò íî fscanf âîçâðàùàåò
            //÷èñëî ñ÷èòàííûõ ïàðàìåòðîâ
            if
            (13 == //Êàê ðàç ïðîâåðÿåì âñå ëè 13 ïàðàìåòðîâ ñ÷èòàëè
                fscanf
                (
                    file,
                    "%d %d %d %d %d %d %d %d %d %d %d %d %d\n",
                    &pList[n].year,
                    &pList[n].month,
                    &pList[n].day,
                    &pList[n].param4,
                    &pList[n].param5,
                    &pList[n].param6,
                    &pList[n].param7,
                    &pList[n].param8,
                    &pList[n].param9,
                    &pList[n].param10,
                    &pList[n].param11,
                    &pList[n].param12,
                    &pList[n].t
                )
            )
            {
                //Åñëè ÷òåíèå óñïåøíî ïå÷àòàåò n-óþ ñòðóêòóðó
                printf
                (
                    "%04d %02d %02d %d %d %d %d %d %d %d %d %d %d\n",
                    pList[n].year,
                    pList[n].month,
                    pList[n].day,
                    pList[n].param4,
                    pList[n].param5,
                    pList[n].param6,
                    pList[n].param7,
                    pList[n].param8,
                    pList[n].param9,
                    pList[n].param10,
                    pList[n].param11,
                    pList[n].param12,
                    pList[n].t
                );
                n = n + 1;//óâåëè÷èâàåì ñ÷¸ò÷èê ñòðóêòóð
                pList = (FILE_DATA *)
                    realloc//Óâåëè÷èâàåì ïàìÿòü ïîä ìàññèâ ñòðóêòóð
                    (
                        (void *)pList, 
                        (1 + n)*sizeof(FILE_DATA)//îäíîâðåìåííî 
                    );
                
            }
        }
        fclose(file);
        if(n == 0)
            printf("File input.txt not contain correct data\n");
        else
        {
            printf("Totlal count of read structures %d\n", n);
            //çäåñü ó íàñ ìàññèâ ñòðóêòóð èç n ýëåìåíòîâ
            //äàëåå äåëàì ñ íèì ÷òî äóøå óãîäíî
        }
    }
    printf("Enter any key for exit\n");
    getchar();
    return 0;
}
input.txt
1946 12 30 0 -519 0 -490 0 9999 9 0 2 0
1946 12 31 0 -528 0 -499 0 9999 9 0 2 0
1947 1 1 0 -477 0 -383 0 -366 0 1 0 0
1947 1 2 0 -406 0 -356 0 -335 0 5 0 0
1947 1 3 0 -481 0 -408 0 -373 0 0 2 0
Проверка http://codepad.org/BAbYwLLY

Не по теме:

PS:Dr.Urban, не зачем этого делать - во первых мы наперёд ограничиваем длинну данных в строке(т.к. строку определённой длинны будем использовать), затем в дальнейшем при разборе всё равно бы scanf-или уже строку а не поток.

1
Миниатюры
Считывание из файла  
Заблокирован
Автор FAQ
31.07.2012, 11:26 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
#include <fstream>
#include <iomanip>
#include <iostream>
using namespace std;
 
//Íåáîëüøîé âåëîñèïåäèê ïî äèíàìè÷åñêîìó àëëîêó â ïëþñàõ
template <class T>
T * cpp_realloc(T * ptr, int size)
{
    T * mem = new T[size];
    if(ptr)
    {
        mem = new T[size];
        memcpy((void *)mem,(void *)ptr,size);
        delete [] ptr;
    }
    return ptr = mem;
}
 
//1946 12 30 0 -519 0 -490 0 9999 9 0 2 0
struct FILE_DATA
{
    int year;
    int month;
    int day;
    int param4;
    int param5;
    int param6;
    int param7;
    int param8;
    int param9;
    int param10;
    int param11;
    int param12;
    int t;
};
 
int main()
{
    int i;//Ñ÷¸ò÷èê
    int n = 0;//Áóäåò ñîäåðæàòü ÷èñëî ñèòàííûõ ñòðîê
    FILE_DATA * pList = NULL;//Óêàçàòåëü íà ìàññèâ ñòðóêòóð FILE_DATA
    ifstream file("input.txt");//Èíèöèàëèçèðóåì ïîòîê ÷òåíèÿ
    if(!file.is_open())
        cout<<"Error open input.txt\n";
    else
    {
        //Âûäåëÿåì ïàìÿòü ïîä ïåðâóþ ñòðóêòóðó ìàññèâà
        pList = new FILE_DATA[1];
        for(n = 0; !file.eof(); )
        {
            //Â ïëþñàõ íàêèíóâ if òîæå ìîæíî ïðîâåðèòü 
            //êîððåêòíîñòü ÷òåíèÿ ïàðàìåòðîâ
            if
            (file>>pList[n].year
                >>pList[n].month
                >>pList[n].day
                >>pList[n].param4
                >>pList[n].param5
                >>pList[n].param6
                >>pList[n].param7
                >>pList[n].param8
                >>pList[n].param9
                >>pList[n].param10
                >>pList[n].param11
                >>pList[n].param12
                >>pList[n].t
            )
            {
                //Åñëè ÷òåíèå óñïåøíî ïå÷àòàåò n-óþ ñòðóêòóðó
                cout<<setw(4)<<pList[n].year<<" "
                    <<setw(2)<<pList[n].month<<" "
                    <<setw(2)<<pList[n].day<<" "
                    <<pList[n].param4<<" "
                    <<pList[n].param5<<" "
                    <<pList[n].param6<<" "
                    <<pList[n].param7<<" "
                    <<pList[n].param8<<" "
                    <<pList[n].param9<<" "
                    <<pList[n].param10<<" "
                    <<pList[n].param11<<" "
                    <<pList[n].param12<<" "
                    <<pList[n].t<<endl;
                n = n + 1;//óâåëè÷èâàåì ñ÷¸ò÷èê ñòðóêòóð
                pList = (FILE_DATA *)
                    cpp_realloc//Óâåëè÷èâàåì ïàìÿòü ïîä ìàññèâ ñòðóêòóð
                    (
                        pList, 
                        (1 + n)
                    );
                
            }
        }
        file.close();
        if(n == 0)
            cout<<"File input.txt not contain correct data"<<endl;
        else
        {
            cout<<"Totlal count of read structures "<<n<<endl;
            //çäåñü ó íàñ ìàññèâ ñòðóêòóð èç n ýëåìåíòîâ
            //äàëåå äåëàì ñ íèì ÷òî äóøå óãîäíî
        }
    }
    cout<<"Enter any key for exit"<<endl;
    getchar();
    return 0;
}
Проверка http://codepad.org/k438viRn
0
Миниатюры
Считывание из файла  
69 / 63 / 5
Регистрация: 09.06.2012
Сообщений: 291
31.07.2012, 11:54 10
-=ЮрА=-,

Не по теме:

Спасибо за СИ-шный код,много полезного извлек :)

0
Заблокирован
Автор FAQ
31.07.2012, 11:55 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
#include <map>
#include <vector>
#include <fstream>
#include <iomanip>
#include <iostream>
using namespace std;
 
//1946 12 30 0 -519 0 -490 0 9999 9 0 2 0
struct FILE_DATA
{
    int year;
    int month;
    int day;
    int param4;
    int param5;
    int param6;
    int param7;
    int param8;
    int param9;
    int param10;
    int param11;
    int param12;
    int t;
};
 
int main()
{
    int n;
    FILE_DATA pDATA = {0};//Òåïåðü íàì íóæíà âñåãî 1-íà ñòðóêòóðà
    //Çàìåíèì íàø óêàùàòåëü íà ìàññèâ íà êàðòó (ìàïó)
    map<int, FILE_DATA> mymap;
    map<int, FILE_DATA>::iterator it;//èòåðàòîð (òèïà ñ÷¸ò÷èêà)
    ifstream file("input.txt");//Èíèöèàëèçèðóåì ïîòîê ÷òåíèÿ
    if(!file.is_open())
        cout<<"Error open input.txt\n";
    else
    {
        //Âûäåëÿåì ïàìÿòü ïîä ïåðâóþ ñòðóêòóðó ìàññèâà
        for(n = 0;!file.eof(); )
        {
            //Â ïëþñàõ íàêèíóâ if òîæå ìîæíî ïðîâåðèòü 
            //êîððåêòíîñòü ÷òåíèÿ ïàðàìåòðîâ
            if
            (file>>pDATA.year
                >>pDATA.month
                >>pDATA.day
                >>pDATA.param4
                >>pDATA.param5
                >>pDATA.param6
                >>pDATA.param7
                >>pDATA.param8
                >>pDATA.param9
                >>pDATA.param10
                >>pDATA.param11
                >>pDATA.param12
                >>pDATA.t
            )
            {
                //âîò òàê äîáàâëåì â êàðòó ýëåìåíò
                //è íå äóìàåì î äèíàìè÷åñêîì âûäåëåíèè ïàìÿòè
                mymap.insert(make_pair(n,pDATA));
                n = n + 1;//óâåëè÷èâàåì ñ÷¸ò÷èê ñòðóêòóð
            }
        }
        file.close();
        if(n == 0)
            cout<<"File input.txt not contain correct data"<<endl;
        else
        {
            cout<<"Totlal count of read structures "<<n<<endl;
            //çäåñü ó íàñ ìàññèâ ñòðóêòóð èç n ýëåìåíòîâ
            //äàëåå äåëàì ñ íèì ÷òî äóøå óãîäíî
            //Ïîêàçûâàþ êàê ÷èòàòü êàðòó
            for(it = mymap.begin(); it != mymap.end(); it++)
            {
                pDATA = (*it).second;
                cout<<setw(4)<<pDATA.year<<" "
                    <<setw(2)<<pDATA.month<<" "
                    <<setw(2)<<pDATA.day<<" "
                    <<pDATA.param4<<" "
                    <<pDATA.param5<<" "
                    <<pDATA.param6<<" "
                    <<pDATA.param7<<" "
                    <<pDATA.param8<<" "
                    <<pDATA.param9<<" "
                    <<pDATA.param10<<" "
                    <<pDATA.param11<<" "
                    <<pDATA.param12<<" "
                    <<pDATA.t<<endl;
            }
        }
    }
    cout<<"Enter any key for exit"<<endl;
    getchar();
    return 0;
}
0
Миниатюры
Считывание из файла  
Заблокирован
Автор FAQ
31.07.2012, 12:06 12
Вот некая абстракция для последнего кода с картой (для лучшего понимания)
http://codepad.org/q5b4MSQy
0
1 / 1 / 0
Регистрация: 30.07.2012
Сообщений: 52
31.07.2012, 13:42  [ТС] 13
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
#include <stdio.h>
#include <stdlib.h>
 
//1946 12 30 0 -519 0 -490 0 9999 9 0 2 0
typedef struct
{
    int year;
    int month;
    int day;
    int param4;
    int param5;
    int param6;
    int param7;
    int param8;
    int param9;
    int param10;
    int param11;
    int param12;
    int t;
}FILE_DATA;
 
int main()
{
    int i;//Счётчик
    int n = 0;//Будет содержать число ситанных строк
    FILE_DATA * pList = NULL;//Указатель на массив структур FILE_DATA
    FILE * file = fopen("U24763","rb");//Инициализируем поток чтения
    FILE * file2 = fopen("input2.txt","w");
 
 
    if(file == NULL)
        printf("Error open input.txt\n");
    else
    {
        //Выделяем память под первую структуру массива
        pList = (FILE_DATA *)malloc(sizeof(FILE_DATA));
        for(n = 0; !feof(file); )
        {
            //Мало кто знает но fscanf возвращает
            //число считанных параметров
            if
            (13 == //Как раз проверяем все ли 13 параметров считали
                fscanf
                (
                    file,
                    "%d %d %d %d %d %d %d %d %d %d %d %d %d\n",
                    &pList[n].year,
                    &pList[n].month,
                    &pList[n].day,
                    &pList[n].param4,
                    &pList[n].param5,
                    &pList[n].param6,
                    &pList[n].param7,
                    &pList[n].param8,
                    &pList[n].param9,
                    &pList[n].param10,
                    &pList[n].param11,
                    &pList[n].param12,
                    &pList[n].t
                )
            )
 
 
                if( &pList[n].param9 ! == 9999
 
                    {
                //Если чтение успешно печатает n-ую структуру
                printf
                (
                    "%04d %02d %02d %d %d %d %d %d %d %d %d %d %d\n",
                    pList[n].year,
                    pList[n].month,
                    pList[n].day,
                    pList[n].param4,
                    pList[n].param5,
                    pList[n].param6,
                    pList[n].param7,
                    pList[n].param8,
                    pList[n].param9,
                    pList[n].param10,
                    pList[n].param11,
                    pList[n].param12,
                    pList[n].t
                );
 
                fprintf
                (file2,
                    "%04d %02d %02d %d %d %d %d %d %d %d %d %d %d\n",
                    pList[n].year,
                    pList[n].month,
                    pList[n].day,
                    pList[n].param4,
                    pList[n].param5,
                    pList[n].param6,
                    pList[n].param7,
                    pList[n].param8,
                    pList[n].param9,
                    pList[n].param10,
                    pList[n].param11,
                    pList[n].param12,
                    pList[n].t
                );
                );
 
 
                n = n + 1;//увеличиваем счётчик структур
                pList = (FILE_DATA *)
                    realloc//Увеличиваем память под массив структур
                    (
                        (void *)pList,
                        (1 + n)*sizeof(FILE_DATA)//одновременно
                    );
 
            }
        }
        fclose(file);
        fclose(file2);
        if(n == 0)
            printf("File input.txt not contain correct data\n");
        else
        {
            printf("Totlal count of read structures %d\n", n);
            //здесь у нас массив структур из n элементов
            //далее делам с ним что душе угодно
        }
    }
    printf("Enter any key for exit\n");
    getchar();
    return 0;
}
Юрий,Спасибо огромное! Я попробовал Ваш первый код, работает,все замечательно! У меня теперь вот такой вопрос. Я хочу вывести только те строки, где у меня в 9 столбце нет числа 9999. Я поставил условие
C++
1
  if( &pList[n].param9 ! == 9999);
В чем здесь ошибка?
0
Заблокирован
Автор FAQ
31.07.2012, 14:19 14
Цитата Сообщение от kuziashagrath Посмотреть сообщение
if( &pList[n].param9 ! == 9999);
сразу три - вот так это условие следует записать
C
1
2
3
4
if( pList[n].param9 ! = 9999)
{
     //
}
0
1 / 1 / 0
Регистрация: 30.07.2012
Сообщений: 52
31.07.2012, 17:34  [ТС] 15
Еще раз спасибо огромное,Юрий! Да, все-таки я Вас еще помучаю=))
PHP
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
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
//1946 12 30 0 -519 0 -490 0 9999 9 0 2 0
typedef struct
{
    int year;
    int month;
    int day;
    int param4;
    int param5;
    int param6;
    int param7;
    int param8;
    int t;
    int param10;
    int param11;
    int param12;
    int param13;
}FILE_DATA;
int l=0;
int sum=0;
int arifmet;
int main()
{
    int i;//Счётчик
    int n = 0;//Будет содержать число ситанных строк
    FILE_DATA * pList = NULL;//Указатель на массив структур FILE_DATA
    FILE * file = fopen("U24763","rb");//Инициализируем поток чтения
    FILE * file2 = fopen("input2.txt","w");
 
 
    if(file == NULL)
        printf("Error open input.txt\n");
    else
    {
        //Выделяем память под первую структуру массива
        pList = (FILE_DATA *)malloc(sizeof(FILE_DATA));
        for(n = 0; !feof(file); )
        {
            //Мало кто знает но fscanf возвращает
            //число считанных параметров
            if
            (13 == //Как раз проверяем все ли 13 параметров считали
                fscanf
 
 
                    (
                    file,
                    "%d %d %d %d %d %d %d %d %d %d %d %d %d\n",
                    &pList[n].year,
                    &pList[n].month,
                    &pList[n].day,
                    &pList[n].param4,
                    &pList[n].param5,
                    &pList[n].param6,
                    &pList[n].param7,
                    &pList[n].param8,
                    &pList[n].t,
                    &pList[n].param10,
                    &pList[n].param11,
                    &pList[n].param12,
                    &pList[n].param13
                )
            )
 
 
 
                    {
                //Если чтение успешно печатает n-ую структуру
                printf
                (
                    "%04d %02d %02d %d %d %d %d %d %d %d %d %d %d\n",
                    pList[n].year,
                    pList[n].month,
                    pList[n].day,
                    pList[n].param4,
                    pList[n].param5,
                    pList[n].param6,
                    pList[n].param7,
                    pList[n].param8,
                    pList[n].t,
                    pList[n].param10,
                    pList[n].param11,
                    pList[n].param12,
                    pList[n].param13
                   );
                if (pList[n].t!=9999){
 
 
 
 
                fprintf
                (file2,
                    "%04d %02d %02d %d %d %d \n",
                    pList[n].year,
                    pList[n].month,
                    pList[n].day,
                    pList[n].t,
                     l,
                    sum);
 
//                );
 
                }
                sum=sum+pList[n].t;
                 l+=1;
 
                n = n + 1;//увеличиваем счётчик структур
                pList = (FILE_DATA *)
                    realloc//Увеличиваем память под массив структур
                    (
                        (void *)pList,
                        (1 + n)*sizeof(FILE_DATA)//одновременно
                    );
 
 
           }
 
        }
//          arifmet=sum/l;
          fprintf(file2,"%d",sum/l);
        fclose(file);
        fclose(file2);
        if(n == 0)
            printf("File input.txt not contain correct data\n");
        else
        {
            printf("Totlal count of read structures %d\n", n);
            //здесь у нас массив структур из n элементов
            //далее делам с ним что душе угодно
        }
    }
    printf("Enter any key for exit\n");
    getchar();
    return 0;
}
Так вопрос-я посчитал суммы температур и сумму строк. Как вывести среднее арифметическое? ТОчнее даже так поставлю вопрос-почему данная величина не выводится на печать в файл? В чем проблема это строки?
PHP
1
          fprintf(file2,"%d",sum/l);
0
Заблокирован
Автор FAQ
31.07.2012, 17:42 16
kuziashagrath, можно ещё раз попросить задание полностью, т.е куда что писать, среднее арифметическое чего от чего, чтобы я писал уже готовый код под твои нужды
1
1 / 1 / 0
Регистрация: 30.07.2012
Сообщений: 52
01.08.2012, 11:43  [ТС] 17
Юр, спасибо тебе огромное, код почти написан, осталось разобраться, почему он ругается и при переходе с одной строки на другую=)) Были даны 13 столбцов, из них надо было убрать те строки, где есть цифра 9999, затем взять среднее арифметическое по годам, т.е. взять среднее за 1958 год, 59 и т.д. и вывести это все в печать=)) В общем, в принципе писать особо ничего не надо, спаисбо тебе огромное-итак фактически задание за меня сделал. Тут спасибо ввиде +1 выдается?=)) У меня была идея такая-поставить в цикл условия-если цифра в 13 столбце и в n+1 строке= n строке, тогда суммируем элементы, если же равентсво не выполняется, тогда выводим на печать сумму и количество подсчитанных строк(ну и их отношения). далее обнуляем их и пускаем заново цикл.Вот собственно фактически твоя же программа
PHP
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
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
//1946 12 30 0 -519 0 -490 0 9999 9 0 2 0
typedef struct
{
    int year;
    int month;
    int day;
    int param4;
    int param5;
    int param6;
    int param7;
    int param8;
    int t;
    int param10;
    int param11;
    int param12;
    int param13;
}FILE_DATA;
int l=0;
int sum=0;
int arifmet;
int main()
{
    int i;//Счётчик
    int n = 0;//Будет содержать число ситанных строк
    FILE_DATA * pList = NULL;//Указатель на массив структур FILE_DATA
    FILE * file = fopen("U24763","rb");//Инициализируем поток чтения
    FILE * file2 = fopen("input2.txt","w");
 
 
    if(file == NULL)
        printf("Error open input.txt\n");
    else
    {
        //Выделяем память под первую структуру массива
        pList = (FILE_DATA *)malloc(sizeof(FILE_DATA));
        for(n = 0; !feof(file); )
        {
            //Мало кто знает но fscanf возвращает
            //число считанных параметров
            if
            (13 == //Как раз проверяем все ли 13 параметров считали
                fscanf
 
 
                    (
                    file,
                    "%d %d %d %d %d %d %d %d %d %d %d %d %d\n",
                    &pList[n].year,
                    &pList[n].month,
                    &pList[n].day,
                    &pList[n].param4,
                    &pList[n].param5,
                    &pList[n].param6,
                    &pList[n].param7,
                    &pList[n].param8,
                    &pList[n].t,
                    &pList[n].param10,
                    &pList[n].param11,
                    &pList[n].param12,
                    &pList[n].param13
                )
            )
 
 
 
                    {
                //Если чтение успешно печатает n-ую структуру
                printf
                (
                    "%04d %02d %02d %d %d %d %d %d %d %d %d %d %d\n",
                    pList[n].year,
                    pList[n].month,
                    pList[n].day,
                    pList[n].param4,
                    pList[n].param5,
                    pList[n].param6,
                    pList[n].param7,
                    pList[n].param8,
                    pList[n].t,
                    pList[n].param10,
                    pList[n].param11,
                    pList[n].param12,
                    pList[n].param13
                   );
                if (pList[n].t!=9999){
 
                    if (pList[n+1].year==pList[n].year){
                        sum=sum+pList[n].t;
                         l++;}
                     else   {
                             fprintf
                              (file2,
                                "%04d \n",
                                  pList[n].year,
                                  sum/(l+1));
                                  sum=0;
                                    l=0;
                                }
 
 
                                        }
 
                n = n + 1;//увеличиваем счётчик структур
                pList = (FILE_DATA *)
                    realloc//Увеличиваем память под массив структур
                    (
                        (void *)pList,
                        (1 + n)*sizeof(FILE_DATA)//одновременно
                    );
 
 
           }
 
        }
//          fwrite(file2,arifmet);
        fclose(file);
        fclose(file2);
        if(n == 0)
            printf("File input.txt not contain correct data\n");
        else
        {
            printf("Totlal count of read structures %d\n", n);
            //здесь у нас массив структур из n элементов
            //далее делам с ним что душе угодно
        }
    }
    printf("Enter any key for exit\n");
    getchar();
    return 0;
}
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
                    if (pList[n+1].year==pList[n].year){
                        sum=sum+pList[n].t;
                         l++;}
                     else   {
                             fprintf
                              (file2,
                                "%04d \n",
                                  pList[n].year,
                                  sum/(l+1));
                                  sum=0;
                                    l=0;
                                }
 
 
                                        }
а вот главное отличие=)) только он почему то ругается при переходе с одного года на другой. Если сможешь подсказать ошибку, суперски. Если замучал-спасибо тебе огромное-очень сильно помог и так!=))


а само задание изначально выглядело примерно так
1966 3 18 0 -343 0 -240 0 -148 0 0 2 0
1966 3 19 0 -348 0 -234 0 -146 0 0 2 0
1967 3 20 0 -240 0 -174 0 -110 0 0 2 0
1967 3 21 0 -158 0 -132 0 -109 0 16 0 0
1968 3 22 0 -164 0 -103 0 -44 0 16 0 0
1968 3 23 0 -130 0 -116 0 -63 0 0 2 0
1968 3 24 0 -184 0 -139 0 -90 0 0 2 0
1969 3 25 0 -154 0 -133 0 -91 0 0 2 0
1969 3 26 0 -245 0 -166 0 -72 0 2 0 0
1969 3 27 0 -293 0 -175 0 -54 0 0 2 0
1970 3 28 0 -262 0 -158 0 -54 0 0 2 0
1970 3 29 0 -194 0 -95 0 -2 0 4 0 0
1970 3 30 0 -104 0 -53 0 0 0 0 2 0
0
Заблокирован
Автор FAQ
01.08.2012, 12:57 18
kuziashagrath, твой код править не хочу (кроме моей части в нём нет ничего верного прошу не воспринимать это как личное). Также исходных данных не достаточно, пишешь о 59-м годе а вривёл 46-47,66-70 (запомни правильное задание все исходные данные это единственный ключ к тому чтобы код решал именно ту задачу которую тебе требуется).
Короче я немножко подправил твои исходные данные(добил в паре строк в 9-й столбец 9999), а также находил средне для 7-го столбца т.к последний (как я понял темпереатура во всех строках == 0 и не видно было бы подсчёта среднего).
Ниже код который после прочтения данных запрашивает нужный год и осуществляет выгрузку валижных строк нужного года в файл одновременно подсчитывая среднее в 7-м столбце(опять же для строк без 9999 в 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
#include <stdio.h>
#include <stdlib.h>
 
//1946 12 30 0 -519 0 -490 0 9999 9 0 2 0
typedef struct
{
    int year;
    int month;
    int day;
    int param4;
    int param5;
    int param6;
    int param7;
    int param8;
    int param9;
    int param10;
    int param11;
    int param12;
    int t;
}FILE_DATA;
 
int main()
{
    int i;//Ñ÷¸ò÷èê
    int n = 0;//Áóäåò ñîäåðæàòü ÷èñëî ñèòàííûõ ñòðîê
    double middle = 0;//Áóäåò ñîäåðæàòü ñðåäíå çíà÷åíèå 7-ãî ñòîëáöà
    //íàäî áóäåò äðóãîé ïðîñòî â êîäå óñëîâèå(âåðíåé èíäåêñ ïîìåíÿåì)
    int m = 0;//Áóäåò ñîäåðæàòü ÷èñëî çàïèñåé íóæíîãî ãîäà â êîòîðûõ 9-é ñòîëáåö íå 9999
    int year = 0;//Áóäåò ñîäåðæàòü çíà÷åíèå ãîäà äëÿ êîòîðîãî îñóùåñòâëÿåòñÿ ðàñ÷¸ò
    FILE_DATA * pList = NULL;//Óêàçàòåëü íà ìàññèâ ñòðóêòóð FILE_DATA
    FILE * file = fopen("input.txt","rb");//Èíèöèàëèçèðóåì ïîòîê ÷òåíèÿ
    if(file == NULL)
        printf("Error open input.txt\n");
    else
    {
        //Âûäåëÿåì ïàìÿòü ïîä ïåðâóþ ñòðóêòóðó ìàññèâà
        pList = (FILE_DATA *)malloc(sizeof(FILE_DATA));
        for(n = 0; !feof(file); )
        {
            //Ìàëî êòî çíàåò íî fscanf âîçâðàùàåò
            //÷èñëî ñ÷èòàííûõ ïàðàìåòðîâ
            if
            (13 == //Êàê ðàç ïðîâåðÿåì âñå ëè 13 ïàðàìåòðîâ ñ÷èòàëè
                fscanf
                (
                    file,
                    "%d %d %d %d %d %d %d %d %d %d %d %d %d\n",
                    &pList[n].year,
                    &pList[n].month,
                    &pList[n].day,
                    &pList[n].param4,
                    &pList[n].param5,
                    &pList[n].param6,
                    &pList[n].param7,
                    &pList[n].param8,
                    &pList[n].param9,
                    &pList[n].param10,
                    &pList[n].param11,
                    &pList[n].param12,
                    &pList[n].t
                )
            )
            {
                //Åñëè ÷òåíèå óñïåøíî ïå÷àòàåò n-óþ ñòðóêòóðó
                printf
                (
                    "%04d %02d %02d %d %d %d %d %d %d %d %d %d %d\n",
                    pList[n].year,
                    pList[n].month,
                    pList[n].day,
                    pList[n].param4,
                    pList[n].param5,
                    pList[n].param6,
                    pList[n].param7,
                    pList[n].param8,
                    pList[n].param9,
                    pList[n].param10,
                    pList[n].param11,
                    pList[n].param12,
                    pList[n].t
                );
                n = n + 1;//óâåëè÷èâàåì ñ÷¸ò÷èê ñòðóêòóð
                pList = (FILE_DATA *)
                    realloc//Óâåëè÷èâàåì ïàìÿòü ïîä ìàññèâ ñòðóêòóð
                    (
                        (void *)pList, 
                        (1 + n)*sizeof(FILE_DATA)//îäíîâðåìåííî 
                    );
                
            }
        }
        fclose(file);
        if(n == 0)
            printf("File input.txt not contain correct data\n");
        else
        {
            printf("Totlal count of read structures %d\n", n);
            //çäåñü ó íàñ ìàññèâ ñòðóêòóð èç n ýëåìåíòîâ
            //äàëåå äåëàì ñ íèì ÷òî äóøå óãîäíî
 
            //ß òàê ïîíÿë ìû â ôàéë äîëæíû íóæíûé ãîä ïåðåíåñòè
            //íó òàê èñïîëüçóåì òîò æå óêàçàòåëü
            file = fopen("output.txt","wt");
            if(file == NULL)
                printf("Error open output.txt\n");
            else
            {
                printf("Enter year : ");
                scanf("%d",&year);//Ââîäèì èíòåðåñóþùèé íàñ ãîä
                getchar();//Óáèðàåì \n îò ââîäà Enter
                for(i = 0; i < n; i = i + 1)
                {
                    //Ïðîâåðêà ÷òî ãîä òîò ÷òî ìû èùåì
                    if(pList[i].year == year)
                    //Ïðîâåðêà 9-é ñòîëáåö != 9999
                    if(pList[i].param9 != 9999)
                    {
                        //ß ïëþñóþ 7-é ñòîëáåö à òàì óæå ïëþñóé êàêîé òåáå íàäî
                        middle = middle + pList[i].param7;
                        m = m + 1;//Óâåëè÷èâåì ñ÷¸ò÷èê çàïèñåé
                        //óäîâëåòâîðÿþùèõ íàøåìó êðèòåðèþ 
                        //ãîä + 9 ñòîëáåö!=9998
                        //Ïèøåì â ôàéëèê
                        fprintf
                        (
                            file,
                            "%d %d %d %d %d %d %d %d %d %d %d %d %d\n",
                            pList[i].year,
                            pList[i].month,
                            pList[i].day,
                            pList[i].param4,
                            pList[i].param5,
                            pList[i].param6,
                            pList[i].param7,
                            pList[i].param8,
                            pList[i].param9,
                            pList[i].param10,
                            pList[i].param11,
                            pList[i].param12,
                            pList[i].t
                        );
                    }
                }
                fclose(file);
                if(m == 0)
                    printf("input.txt not contain neccessary data\n");
                else
                {
                    printf
                    (
                        "middle value of 7-th column : %.3f\n",//Íàïîìèíàþ äëÿ âåùåñòâåííîãî òàêîé ñïåöèôèêàòîð
                        (middle / m)//Äåëèì íàøó ñóììó íà ÷èñëî âàëèäíûõ ñòðîê
                    );
                }
            }
        }
    }
    printf("Enter any key for exit\n");
    getchar();
    return 0;
}
output.txt
1968 3 22 0 -164 0 -103 0 -44 0 16 0 0
1968 3 23 0 -130 0 -116 0 -63 0 0 2 0
0
Миниатюры
Считывание из файла  
Заблокирован
Автор FAQ
01.08.2012, 13:03 19
Касательно твоих ошибок
Цитата Сообщение от kuziashagrath Посмотреть сообщение
if (pList[n].t!=9999){
- чё за бред, тебе 9-й столбец надо а не столбец температуры
Цитата Сообщение от kuziashagrath Посмотреть сообщение
Причем если в 8 столбце стоит значение 9999, то строку не выписывать во второй файл.
- причём по файлу как я понял это 9-й а не 8-й столбец

Цитата Сообщение от kuziashagrath Посмотреть сообщение
if (pList[n+1].year==pList[n].year){
* * * * * * * * * * * * sum=sum+pList[n].t;
* * * * * * * * * * * * *l++;}
* * * * * * * * * * *else * {
* * * * * * * * * * * * * * *fprintf
* * * * * * * * * * * * * * * (file2,
* * * * * * * * * * * * * * * * "%04d \n",
* * * * * * * * * * * * * * * * * pList[n].year,
* * * * * * * * * * * * * * * * * sum/(l+1));
* * * * * * * * * * * * * * * * * sum=0;
* * * * * * * * * * * * * * * * * * l=0;
* * * * * * * * * * * * * * * * }
- дурацкое условие, хотя да оно способно отработать но концепт неверный, проберать надо все строки (а если бы всё не отсортированно по годам было и скажем за 59 1-й тсрокой шёл 78 - как бы твой алгоритм работал?)

Цитата Сообщение от kuziashagrath Посмотреть сообщение
"%04d \n",
* * * * * * * * * * * * * * * * * pList[n].year,
* * * * * * * * * * * * * * * * * sum/(l+1));
- кто считает среднее арифметическое как целое
К примеру идут числа 17 + 4 + 5 ну чему равно их среднее арифметическое? наверное 26/3 ~ 8.67 но никак не 8 который получится при целочисленном делении 26 на 3.
Есть ещё замечания но они не концептуальны и их пожалуй опущу...
0
1 / 1 / 0
Регистрация: 30.07.2012
Сообщений: 52
02.08.2012, 16:10  [ТС] 20
Юр, еще раз спасибо огромное за коды, в результате разобрался где у меня ошибка. Понял, где и как выводить. Кстати, я долольно простой человек, так что не обижаюсь на критику, отношусь с юмором. Я учусь, а если делаешь что то впервые, ошибки неизбежны=)))
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.08.2012, 16:10

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Считывание из файла в С++
Всем доброго времени суток. Есть задача: Дан текстовый файл в котором записаны данные следующим...

считывание из файла
Считывает нормально но как я понял надо перевести в int для расчетов, Как это сделать? #include...

Считывание из файла
Здравствуйте! Такой вопрос. Как можно считать информацию из файла следующим образом: в текстовом...

Считывание файла
Как можно считать из файла строку 110011, как массив чисел, заранее спасибо!


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

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

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