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

Считать из файла строку по определенным правилам

10.11.2013, 17:24. Просмотров 846. Ответов 4
Метки нет (Все метки)

Привет всем! Сейчас пытаюсь разобраться с массивами структур ,пытаюсь считать из файла строку её по определенным правилам (каждая часть структуры записана в строке через табуляцию ) и записать в массив структур, но что то даже не знаю с чего начать
ПОМОГИТЕ ПОЖАЛУЙСТА!!!
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2013, 17:24
Ответы с готовыми решениями:

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

Как можно сделать так чтобы отсылаемые письма сортировались по определенным папкам по определенным правилам?
Всем доброго времени суток. Подскажите пожалуйста как можно сделать так чтобы отсылаемые письма...

Сформировать матрицу по определенным правилам
Помогите решить задание. Само задание: сформируйте двумерный массив А(N;N) по следующему правилу:...

Заполнение двумерного массива по определенным правилам
Всем доброго времени суток!:) Заполните двумерный массив так, как представлено ниже. Написать...

Распечатать числовую последовательность, которая задается по определенным правилам
Распечатать числовую последовательность, которая задается по следующим правилам: - первое число...

4
fanatdebian
Z3JheSBoYXQ=
339 / 234 / 83
Регистрация: 08.07.2012
Сообщений: 577
11.11.2013, 04:21 2
При работе со структурами оперируй структурами в операциях чтения/записи. Структура это абстракция. Представь контейнер - физическую коробку с книгами. Каждая такая коробка это структура. Если сложить, к примеру 10 таких коробок в одну большую получится файл. Для того, чтобы достать книгу из коробки под номером 2 тебе для начала надо вынуть эту коробку из большого контейнера(файла) потом открыть ее и взять нужную тебе книгу.

При понимании любых абстракций используй близкие тебе аналогии из материальных объектов. Все что угодно, что тебе близко и знакомо. Так лучше будет усваиваться и запоминаться.
1
Misha_prog
0 / 0 / 1
Регистрация: 15.04.2013
Сообщений: 184
12.11.2013, 21:17  [ТС] 3
извините, вродебы вот пытаюсь а компьютер файл компилирует но вов ремя работы выдаёт ошибку
вот код
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int openFile(char **name, FILE **f);
 
void bufferSize(char **str, int size, int cons);
 
void newBufferSize(char **str, int cons);
 
int recordInStruct(struct product* mas,char *str);
 
 
struct product{
  int id;     // Идентификатор
  char productName[255];  // название продукта 
  int price; // цена
  int count; // Количество 
};
 
int main() {
    struct product *goods = NULL; // указатель на массив структур 
    FILE *f;
    
    char *name="input.txt", *str=NULL, **arrstr=NULL;
    int i, c, j, pam=0, cns=255;
 
    goods = (struct product *)malloc(1*sizeof(struct product *));
    newBufferSize(&str, cns);
    
    if (openFile(&name, &f) == 1) {
        i=0;   j=0;
        while ((c = getc(f)) != EOF) {      /** считываем из файла стркоу неопределенной длины */               
            if (c == '\n') { 
                i++;
                str[i-1] = '\0';
                pam = pam+i;            
                arrstr = (char**)realloc(arrstr, pam);
                j++;
                arrstr[j-1] = str;                  
 
                str=NULL;
                newBufferSize(&str, cns);
                i=0; 
 
            } else {
                i++;
                if ((i % cns) == 0) {                   
                    bufferSize(&str, i, cns);
                    printf("new_size=%d ", sizeof(&str));
                }           
                str[i-1] = c;                   
 
            }
        }
        str[i] = '\0';
        pam = pam + i - 1;          
        arrstr = (char**)realloc(arrstr, pam);
        arrstr[j] = str;
        printf("string from file: \n");
        
        for (i=0; i<=j; i++) {   /* здесь аходятся строки */
            //printf("%s\n",arrstr[i]);
            
            goods = realloc(goods ,(i + 1)*sizeof(struct product *));
            recordInStruct(goods,arrstr[i]);
        }   
        
 
        free(arrstr);
        free(str);
    } else puts("не удалось открыть файл\n");
 
    free(goods);
    return 0;
}
/**
 * выделяем память под буффер
 * 
 **/
void newBufferSize(char **str, int cons) {
    *str=(char*) malloc(cons*sizeof(char));
}
/**
 * перераспределяем память
 * 
 **/
void bufferSize(char **str, int size, int cons) {
    *str=(char*)realloc(*str, (size+cons)*sizeof(char));
}
 
/**
 * прверяем на открытость файла
 * 
 **/
 
int openFile(char **name, FILE **f) {
    if ((*f=fopen(*name, "r"))==NULL) return 0;
    else return 1;
}
 
 
int recordInStruct(struct product* mas,char *str)
{
    int flag;
    int k;
    int i ;
    int p;
    k = 0;
    p = 0;
    flag = 0;
    i = 0;
    exit;
    while(i < strlen(str))
    {
        k = i;
        while((flag == 0) && (str[k] != '\t') && (k < strlen(str)))
        {
            mas->id = mas->id*10 + (str[k] - 48);
            k++;
        }
        while((flag == 1) && (str[k] != '\t') && (k < strlen(str)))
        {
            mas->productName[k] = str[k];
            k++;
            p++;
        }
        while((flag == 2) && (str[k] != '\t') && (k < strlen(str)))
        {
            mas->price = mas->price*10 + (str[k] - 48);
            k++;
        }
        while((flag == 3) && (str[k] != '\t') && (k < strlen(str)))
        {
            mas->count = mas->count*10 + (str[k] - 48);
            k++;
        }
        if(str[k] == '\t')
            flag++;
        i = k;
        i++;
    }
    return 0;
}
типа где то происходит утечка памяти, а вот где не понятно...
0
vua72
418 / 417 / 167
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
16.11.2013, 03:20 4
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Как ві думаете, под что вы выделяете память в этой строке
C
1
goods = (struct product *) malloc(1 * sizeof(struct product *));
114 строка?
120 строка, что такое mas?
Если одна запись на строку в файле, то подход вообще левый

C
1
2
3
4
 int id;     // Идентификатор
  char productName[255];  // название продукта 
  int price; // цена
  int count; // Количество
у вас в строке будут последовательно значения полей вашей структуры,
если весь файл через разделитель, то просто считывайте в цикле от одного до пяти,
плюс не такая уж и неизвестная у вас длина строки, вы можете приблизительно оценить ее.

Код - солянка, натасканная отовсюду. Вы хоть алгоритм проговорите, или напишите лучше, потом посмотрите на ваш код.
1
Misha_prog
0 / 0 / 1
Регистрация: 15.04.2013
Сообщений: 184
16.11.2013, 10:30  [ТС] 5
Спасибо за советы, я вот как думал делать, вот в такой голове у меня алгоритм работы был когда я это делал : Сначала считываем из файла массив строк, потом в освобождаем память для массива структур , в функцию передаем строку , указатель на структуру и индекс массива структур , там уже по правилам считываем, вот я код переделал , вроде бы работает
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int openFile(char **name, FILE **f);
 
void bufferSize(char **str, int size, int cons);
 
void newBufferSize(char **str, int cons);
 
int recordInStruct(struct product* mas,char *str,int index);
 
 
 typedef struct{
  int id;     // Идентификатор
  char *productName;  // название продукта 
  int price; // цена
  int count; // Количество 
}  product;
 
int main() {
    product *goods; // указатель на массив структур 
    FILE *f;
    char *name="input.txt", *str=NULL, **arrstr=NULL;
    int i, c, j, pam=0, cns=255;
 
    goods = (product *)malloc(1*sizeof(product ));
    newBufferSize(&str, cns);
    
    if (openFile(&name, &f) == 1) {
        i=0;   j=0;
        while ((c = getc(f)) != EOF) {      /** считываем из файла стркоу неопределенной длины */               
            if (c == '\n') { 
                i++;
                str[i-1] = '\0';
                pam = pam+i;            
                arrstr = (char**)realloc(arrstr, pam);
                j++;
                arrstr[j-1] = str;                  
 
                str=NULL;
                newBufferSize(&str, cns);
                i=0; 
 
            } else {
                i++;
                if ((i % cns) == 0) {                   
                    bufferSize(&str, i, cns);
                    printf("new_size=%d ", sizeof(&str));
                }           
                str[i-1] = c;                   
 
            }
        }
        str[i] = '\0';
        pam = pam + i - 1;          
        arrstr = (char**)realloc(arrstr, pam);
        arrstr[j] = str;
        for (i=0; i<=j; i++) {   /* здесь аходятся строки */
            //printf("%s\n",arrstr[i]);
            
            goods = realloc(goods ,(i + 1)*sizeof(product));
            recordInStruct(goods,arrstr[i],i);
        }   
        
 
        free(arrstr);
        free(str);
    } else puts("не удалось открыть файл\n");
    for(i = 0;i <= j; i++ )
    {
        printf("%d\t",goods[i].id);
        printf("%s\t",goods[i].productName);
        printf("%d\t",goods[i].price);
        printf("%d\t",goods[i].count);
        printf("\n");
    }
    free(goods);
    return 0;
}
/**
 * выделяем память под буффер
 * 
 **/
void newBufferSize(char **str, int cons) {
    *str=(char*) malloc(cons*sizeof(char));
}
/**
 * перераспределяем память
 * 
 **/
void bufferSize(char **str, int size, int cons) {
    *str=(char*)realloc(*str, (size+cons)*sizeof(char));
}
 
/**
 * прверяем на открытость файла
 * 
 **/
 
int openFile(char **name, FILE **f) {
    if ((*f=fopen(*name, "r"))==NULL) return 0;
    else return 1;
}
 
/**
  *Записываем в структуру
  * 
  **/
int recordInStruct(product* mas,char *str,int index)
{
    int flag;
    int k;
    int i ;
    int p;
    int beginstr;
    k = 0;
    p = 0;
    beginstr = 0;
    flag = 0;
    i = 0;
    mas[index].id = 0;
    mas[index].price = 0;
    mas[index].count = 0;
    while(i < strlen(str))
    {
        k = i;
        while((flag == 0) && (str[k] != '\t') && (k < strlen(str)))
        {
            
            mas[index].id = mas[index].id*10 + (str[k] - 48);
            k++;
            beginstr = k + 1;
        }
        while((flag == 1) && (str[k] != '\t') && (k < strlen(str)))
        {
            p++;
            k++;
        }
        
        while((flag == 2) && (str[k] != '\t') && (k < strlen(str)))
        {
            mas[index].price = mas[index].price*10 + (str[k] - 48);
            k++;
        }
        while((flag == 3) && (str[k] != '\t') && (k < strlen(str)))
        {
            mas[index].count = mas[index].count*10 + (str[k] - 48);
            k++;
        }
        if(str[k] == '\t')
            flag++;
        i = k;
        i++;
    }
    mas[index].productName = (char *)malloc((p + 1)*sizeof(char));
    i = beginstr;
    p = 0;
    while(str[i] != '\t')
    {
        mas[index].productName[p] = str[i];
        p++;
        i++;
    }
    mas[index].productName[p] = '\0';
    return 0;
}
0
16.11.2013, 10:30
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2013, 10:30

Считать с файла (input.txt) строку, перевернуть строку, записать файл (put.txt) эту строку
Считать с файла (input.txt) строку, перевернуть строку, записать файл (put.txt) эту строку.

Экспорт содержимого листа Excel в текстовый файл по определенным правилам
Необходимо произвести экспорт содержимого определенных ячеек в текстовый файл с кодировкой DOS. В...

Дана вещественная матрица. Сформировать на ее базе вектор по определенным правилам
Дана вещественная матрица размерности n * m. Сформировать вектор b, в котором элементы вычисляются...


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

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

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