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

Загрузка файла с предобработкой

01.10.2012, 18:30. Просмотров 498. Ответов 4
Метки нет (Все метки)

Есть файл, в котором комментарии задаются от // и до конца строки, а содержательные строки имеют вид:
имя = значение

Как считать этот файл таким образом, чтобы можно было получить развернутую строку-значение, соответствующую имени параметра?

При этом, если в значении последующих строк встреттся выражение $имя$, то его следует заменить на значение. НАпример:
имя1 = asfdsf
имя2 = 123&имя1$123
заменить на
имя1 = asfdsf
имя2 = 123asfdsf123
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.10.2012, 18:30
Ответы с готовыми решениями:

Загрузка файла с ftp
Добрый день. Подскажите библиотеку или иной способ для работы с ftp. Нужно просто скачать файл с...

Загрузка файла определенной структуры
Всем привет! Помогите пожалуйста решить проблему. Имеется простенькая стековая виртуальная...

Загрузка файла в ТекстБокс и открытие файла, зная его полный путь!
Всем привет! Имеется определенная проблема: ввожу в textbox полный путь к файлу, после сохраняю...

Загрузка файла через curl, а вместо файла страница с кроказабярами
Скачиваю файл через curl, а вместо него вылазает страница с крокозябрами HTTP/1.1 100 Continue...

Загрузка содержимого doc файла в RichTextBox по пути файла
Как вывести данный в RichTextBox с doc документа по его пути при нажатие кнопки?

4
Кот Ангенс
318 / 268 / 128
Регистрация: 24.05.2012
Сообщений: 629
01.10.2012, 20:35 2
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 <memory.h>
#include <stdio.h>
#include <stdlib.h>
 
enum {
    BUFF_SIZE = 3,
    PAIR_BUFFER = 5
};
 
typedef struct {
    char* name;
    char* value;
} pair;
 
int main() {
    pair* p = (pair*)malloc(PAIR_BUFFER * sizeof(pair));
    unsigned psize = PAIR_BUFFER, j, n = 0;
    char* buffer = (char*)malloc(BUFF_SIZE * sizeof(char));
    unsigned bsize = BUFF_SIZE;
    unsigned char i;
    char* buffer2 = (char*)malloc(BUFF_SIZE * sizeof(char));
    unsigned b2size = BUFF_SIZE;
    unsigned char i2;
    FILE* f = fopen("input.txt", "r");
    short c;
    char slash = 0;
 
    while ((c = getc(f)) != EOF)
        if (c == '/')
            while ((c = getc(f)) != '\n' && c != EOF) { }
        else {
            buffer[0] = c;
            i = 1;
            while ((buffer[i] = getc(f)) != ' ')
                if (++i == bsize)
                    buffer = (char*)realloc(buffer, (bsize += BUFF_SIZE) * sizeof(char));
            p[n].name = (char*)malloc((i + 1) * sizeof(char));
            memcpy(p[n].name, buffer, i * sizeof(char));
            p[n].name[i] = '\0';
 
            getc(f);/* '=' */
            getc(f);/* ' ' */
            i = 0;
            while ((buffer[i] = c = getc(f)) != '\n' && c != EOF) {
                if (buffer[i] == '$') {
                    slash = 0;
                    i2 = 0;
                    while ((buffer2[i2] = getc(f)) != '$')
                        if (++i2 == b2size)
                            buffer2 = (char*)realloc(buffer2, (b2size += BUFF_SIZE) * sizeof(char));
                    for (j = 0; j < n; j++)
                        if (!p[j].name[i2] && !memcmp(p[j].name, buffer2, i2 * sizeof(char))) {
                            for (i2 = 0; p[j].value[i2]; i2++) {
                                buffer[i] = p[j].value[i2];
                                if (++i == bsize)
                                    buffer =
                                        (char*)realloc(buffer, (bsize += BUFF_SIZE) * sizeof(char));
                            }
                            break;
                        }
                    continue;
                } else if (buffer[i] == '/') {
                    if (slash) {
                        while ((c = getc(f)) != '\n' && c != EOF) { }
                        slash = 0;
                        i--;
                        break;
                    }
                    slash = 1;
                } else
                    slash = 0;
                if (++i == bsize)
                    buffer = (char*)realloc(buffer, (bsize += BUFF_SIZE) * sizeof(char));
            }
            p[n].value = (char*)malloc((i + 1) * sizeof(char));
            memcpy(p[n].value, buffer, i * sizeof(char));
            p[n].value[i] = '\0';
            if (++n == PAIR_BUFFER)
                p = (pair*)realloc(p, (psize += PAIR_BUFFER) * sizeof(char));
        }
    fclose(f);
    for (j = 0; j < n; j++) {
        for (i = 0; p[j].name[i]; i++)
            putchar(p[j].name[i]);
        free(p[j].name);
        putchar(' ');
        putchar('=');
        putchar(' ');
        puts(p[j].value);
        free(p[j].value);
    }
    free(p);
    free(buffer);
    free(buffer2);
    getchar();
}
2
Drimerg
0 / 0 / 0
Регистрация: 02.05.2012
Сообщений: 8
11.11.2012, 18:56  [ТС] 3
Немного изменил код. Теперь комментарии после # и ввел проверки на пробелы и т.д.
Но когда в текстовы файл, например, записываю
Кликните здесь для просмотра всего текста
par0 = znachenie 0 #komment
gthjrhrthrs
p ar1## = ##znach#1 ##/fhndgbhdfgb
par2 = #zn#ach##2
#par3## = # znach#3 ##/fhndgbhdfgb
par4 = z$$n#ach##4
par5= znggff$fggggg #ach##4
par6 =zn$par4$aaaa aaa adfg#ach##4
par0 = znachenie 0 #komment
gthjrhrthrs
p ar1## = ##znach#1 ##/fhndgbhdfgb
par2 = #zn#ach##2
#par3## = # znach#3 ##/fhndgbhdfgb
par4 = z$$n#ach##4
par5= znggff$fggggg #ach##4
par6 =zn$par4$aaaa aaa adfg#ach##4

то выдает ошибку. Может кто-нибудь помочь разобраться?
Если меньше строк записываю в файл, например,
Кликните здесь для просмотра всего текста
par0 = znachenie 0 #komment
gthjrhrthrs
p ar1## = ##znach#1 ##/fhndgbhdfgb
par2 = #zn#ach##2
#par3## = # znach#3 ##/fhndgbhdfgb
par4 = z$$n#ach##4
par5= znggff$fggggg #ach##4
par6 =zn$par4$aaaa aaa adfg#ach##4

то все ок считывает.

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
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
 
enum {
    BUFF_SIZE = 3,
    PAIR_BUFFER = 5
};
 
typedef struct {
    char* name;
    char* value;
} pair;
 
int main(void)
{
    pair *p = (pair*)malloc(PAIR_BUFFER * sizeof(pair));
    unsigned int psize = PAIR_BUFFER, j, n = 0;
    char *buffer = (char*)malloc(BUFF_SIZE * sizeof(char));
    unsigned int bsize = BUFF_SIZE;
    int i;
    char *buffer2 = (char*)malloc(BUFF_SIZE * sizeof(char));
    unsigned int b2size = BUFF_SIZE;
    int i2;
    FILE *f;
    char c;
    int reshotka = 0, k, t;
 
    f = fopen("C:\\Tester\\input.txt", "r");
    while ((c = getc(f)) != EOF)
        if (c == '#')
            while ((c = getc(f)) != '\n' && c != EOF) 
                ;
        else 
        {
            reshotka = 0;
            while (c  == ' ') //забыл про табуляцию
                c = getc(f);
            buffer[0] = c;
            i = 1;
            while ((c = getc(f)) != '=') 
            {
                if (c == '#') 
                {
                    reshotka = 1;
                    while ((c = getc(f)) != '\n' && c != EOF) 
                        ;
                    printf("error\n");
                    break;
                }
                if (c != ' ') // табуляцию проверить
                {
                    buffer[i] = c;
                    if (++i == bsize)                   
                        buffer = (char*)realloc(buffer, (bsize += BUFF_SIZE) * sizeof(char));
                }
            }
            if (reshotka == 1) 
                continue;
            p[n].name = (char*)malloc((i + 1) * sizeof(char));
            memcpy(p[n].name, buffer, i * sizeof(char));
            p[n].name[i] = '\0';
            
            c = getc(f);
            if (c == ' ') //также добавить табуляцию
                while (c  == ' ' && c != '\n' && c != EOF) 
                    c = getc(f);
            if (c == '#' || c == '\n')
            {
                while ((c = getc(f)) != '\n' && c != EOF) 
                        ;
                free(p[n].name);
                continue;
            }       
            i = 0;
            while ((buffer[i] = c) != '\n' && c != EOF && c != '#') 
            {         
                if (buffer[i] == '$')
                {
                    i2 = 0;
                    t=0;
                    while ((buffer2[i2] = getc(f)) != '$')
                    {
                        if (buffer2[i2] == '\n' || buffer2[i2] == EOF || buffer2[i2] == '#')
                        {
                            break;
                            t=1;
                        }
                        if (++i2 == b2size-1)
                            buffer2 = (char*)realloc(buffer2, (b2size += BUFF_SIZE) * sizeof(char));
                    }
                    if (t == 1) 
                    {
                        for (k = 0; k<i2; k++) 
                            {
                                buffer[i+1] = buffer2[k];
                                if (++i == bsize)
                                    buffer = (char*)realloc(buffer, (bsize += BUFF_SIZE) * sizeof(char));
                            }
                        break;
                    }
                    for (j = 0; j < n; j++)         
                        if (!p[j].name[i2] && !memcmp(p[j].name, buffer2, (i2) * sizeof(char)))                         
                        {
                            for (k = 0; k < i2; k++) 
                            {
                                buffer[i] = p[j].value[k];
                                if (++i == bsize)
                                    buffer = (char*)realloc(buffer, (bsize += BUFF_SIZE) * sizeof(char));
                            }   
                            t = 1;
                            getc(f);
                            break;
                        }
                    if (t == 0) 
                        for (j = 0; j < i2+1; j++) 
                            {
                                buffer[i+1] = buffer2[j];
                                if (++i == bsize)
                                    buffer = (char*)realloc(buffer, (bsize += BUFF_SIZE) * sizeof(char));                               
                            }                       
                }
                
                if (buffer[i] == '#') 
                    {
                            while ((c = getc(f)) != '\n' && c != EOF)
                                ;
                            break;          
                    } 
                if (++i == bsize)
                   buffer = (char*)realloc(buffer, (bsize += BUFF_SIZE) * sizeof(char));
                c = getc(f);
            }
            // уберем из параметра пробелы в конце
            j = 0;
            for (j = strlen(buffer) - 1; j >= 0; j--)
            {
                if (buffer[j] != ' ' && buffer[j] != '\t' && buffer[j] != '\n')
                    break;
                buffer[j+1] = '\0';
            }
 
            p[n].value = (char*)malloc((i + 1) * sizeof(char));
            memcpy(p[n].value, buffer, i * sizeof(char));
            p[n].value[i] = '\0';
            if (++n == PAIR_BUFFER)
                p = (pair*)realloc(p, (psize += PAIR_BUFFER) * sizeof(char));
        }
    fclose(f);
    for (j = 0; j < n; j++)
    {
        for (i = 0; p[j].name[i]; i++)
            putchar(p[j].name[i]);
        free(p[j].name);
        putchar(' ');
        putchar('=');
        putchar(' ');
        puts(p[j].value);
        free(p[j].value);
    }
    free(p);
    free(buffer);
    free(buffer2);
    getchar();
}
0
Drimerg
0 / 0 / 0
Регистрация: 02.05.2012
Сообщений: 8
13.11.2012, 20:30  [ТС] 4
Никто не поможет? Никак не могу тайти ошибку((
0
alkagolik
14.11.2012, 02:23     Загрузка файла с предобработкой
  #5

Не по теме:

Цитата Сообщение от Drimerg Посмотреть сообщение
Никто не поможет? Никак не могу тайти ошибку((
вот беда... бывает что вроде и ошибок нет, а все равно возникают и воспроизвести невозможно...

0
14.11.2012, 02:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.11.2012, 02:23
Привет! Вот еще темы с ответами:

Загрузка данных из файла с возможностью выбора файла
Всем доброго времени суток. У меня возник такой вопрос как организовать выбор файла с данными на...

Загрузка из фАйла
Здравствуйте. У меня не получается написать процедуру чтения из файла. Мне необходимо в формулу...

Загрузка из файла ...
Доброго времени суток:) Загрузка из файла определённые строки. У меня есть файл *.тхт и мне нужно...


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

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

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