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

Посимвольное считывание в структуру

08.06.2016, 22:29. Просмотров 404. Ответов 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
t = 0;
k = 0;
do
            {
                s = fgetc(f_in); // Считывание символа в переменную
                if ((s != EOF) || (p != EOF)) //Если не конец
                {
                    
                    if (s == '|') //если разделитель
                    {
 
                        do
                        {
                            p = fgetc(f_in); //считываем следующий символ
                            
                            if ((p != EOF) || (s != EOF) ) //если не конец
                            {
                                inf.s2[k] = p; //помещаем во второй массив
                                k = k + 1;
                                
 
                            }
                        } while ((p != '\n') && (p != EOF)); //пока не достигнет конца строки или файла
                        inf.s1[t] = '\n';
                        t = t + 1;
                        
                    }
                    else inf.s1[t] = s;//иначе помещаем в первый
                    
                        t = t + 1;
                }
            } while (s != EOF) ;
            puts(inf.s1);
            puts("-----");
            puts(inf.s2);
Перепробовал кучу вариантов, возможно где-то с условиями или циклом напортачил. На данный момент в первую переменную первая строка файла считывается до разделителя, дальше всё сбивается, но в целом хотя бы похоже на то что нужно, во втором же массиве ахинея. Буду благодарен если поможете, не могу понять где ошибка.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.06.2016, 22:29
Ответы с готовыми решениями:

Посимвольное считывание файла
Почему вместе с символами, записанными в файле, считываются какие-то еще? int i=0,n,sum; char*...

Посимвольное считывание файла
Как считать файл посимвольно? Файл состоит из 1-й строки и включает в себя цифры разделённые...

Посимвольное считывание строки из файла
Прошу помощи, хотелось бы считать строку из файла (в котором много строк) посимвольно и записать...

Посимвольное считывание с файла не работает
Проблема решена заменой на while (!feof(analyzedFile)) { ch = fgetc(analyzedFile); ...

Посимвольное считывание строки, нужны комментарии
Кто-нибудь может пожалуйста объяснить построчно,что делает эта программа? #include <stdio.h> ...

4
Klod503
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 6
11.06.2016, 16:20  [ТС] 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
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <iostream>
#define NMAX 200
void main()
{
    setlocale(LC_ALL, "Russian");
    typedef struct { char s1[1], s2[1]; } a_d;
    a_d inf;
    int i, t, s, k, p, o, r;
    a_d *ad = (a_d*)malloc(sizeof(a_d));
    FILE *f_in, *f_out;
    f_in = fopen("f_in.txt", "rt");
    if (f_in == NULL)
        puts("Файл не может быть открыт");
    else
        if (getc(f_in) == EOF)
            puts("Открываемый файл пуст");
        else
        {
            rewind(f_in);
            f_out = fopen("f_out.txt", "wt");
            i = 0;
            t = 0;
            k = 0;
            p = 0;
            s = 0;
            r = 0;
            
            puts("Сведения о заказах:\n");
            while (!feof(f_in))
            {
                s = fgetc(f_in);
                if (s == ',')
                    k = k + 1;
                if (k == 3)
                {
                    while (((s = fgetc(f_in)) != '\n') && (!feof(f_in)))
                    {
                        r = r + 1;
                        inf.s2[p] = s;
                        p = p + 1;
                        ad =(a_d*) realloc(ad, sizeof(a_d)*r);
                    }
                    k = 0;
 
 
                }
                else
                {
                    r = r + 1;
                    inf.s1[t] = s;
                    t = t + 1;
                    ad = (a_d*)realloc(ad, sizeof(a_d)*r);
                }
 
            }
 
 
            puts(inf.s1);
            puts("-----");
            puts(inf.s2);
 
 
        }
    _getch();
}
Данные в файле теперь сделал следующего порядка:
Улица, дом, квартира, дата
Т.е. считываю до последней запятой в первый массив, дальше до конца строки в другой. Вообще не принципиально, как будут оформлены данные в текстовике.

Собственно, уверен, что неправильно память распределяю/объявляю/может вообще не той функцией.
На данном этапе проблема заключается в том, что данные начинают считываться сразу в две переменные. Мне бы понять, как правильно выделить память под структуру или даже как отдельно выделять для каждого поля. Интересует только этот момент.
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
11.06.2016, 17:32 3
Цитата Сообщение от Klod503 Посмотреть сообщение
хочу, чтобы при каждом считывании символа выделялась память под него.
память вы под него не выделяете. все выделение памяти у вас - в молоко и не к месту. а символы пишите за границу массивов(и почему они объявлены char [1])
лучше озвучьте задание
0
Klod503
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 6
11.06.2016, 19:23  [ТС] 4
Цитата Сообщение от retmas Посмотреть сообщение
все выделение памяти у вас - в молоко и не к месту. а символы пишите за границу массивов
Ну да, что не правильно я выделяю, это я понял. Можно в моем коде сделать так, чтобы при считывании выделялась память под символ?
Само задание так звучит:

Сведения о заказе состоят из адреса (улица, дом, квартира) и даты (число, месяц, год) исполнения. Вывести сведения о заказах, которые должны быть выполнены на Московской улице, и их количество. Каждая строка текстового файла считывается в переменную-структуру, состоящая из полей адрес и дата.

В коде у меня пока что только считывание из файла сделано, это черновой вариант, вывод последующий я сам сделаю. Вообще, можно конечно разделить пробелами данные и считать fscanf, но хочу сделать посимвольно и разобраться как память выделять.
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
11.06.2016, 21:47 5
Цитата Сообщение от Klod503 Посмотреть сообщение
хочу, чтобы при каждом считывании символа выделялась память под него.
для начала определите структуру заказа более вменяемо. например, так:
C
1
2
3
4
5
struct order
{
    char* addr;
    char* date;
};
тогда члены addr и date можно использовать для (пере)распределения динамической памяти под данные заказа.
идея посимвольного добавления в строку следующая:
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
char* string_append(char* str, size_t len, char c)
{
    char* ret = realloc(str, sizeof (char) * (len + 2));
    if (ret)
    {
        ret[len] = c;
        ret[len + 1] = '\0';
    }
    return ret;
}
 
...
 
char* str = NULL;
size_t len = 0;
...
while ((c = fgetc(fp)) != EOF)
{
...
    char* tmp = string_append(str, len, c);
    if (tmp)
    {
        str = tmp;
        ++len;
    }
...
}
но посимвольно считывать и распределять память не эффективно.
набор заказов можно реализовать как список.
Цитата Сообщение от Klod503 Посмотреть сообщение
Можно в моем коде сделать так, чтобы при считывании выделялась память под символ?
лучше перепишите заново
0
11.06.2016, 21:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.06.2016, 21:47

Посимвольное считывание с файла и запись в массив
Всем привет, подскажите, правильно ли я выполняю посимвольное(Нужно считывать, не зная заранее...

Посимвольное считывание из файла - в конце строки появляется символ "Я"
Здравствуйте! Который раз сталкиваюсь с этой проблемой! Нужно считать информацию из файла и...

Считывание из файла в структуру
структура вида название_фильма,стоимость,режиссер.Данные в файле.Как считать название фильма...


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

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

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