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

Считывание данных из файла в структуру - C++

Восстановить пароль Регистрация
 
sd710
1 / 1 / 0
Регистрация: 19.12.2012
Сообщений: 23
26.05.2013, 17:45     Считывание данных из файла в структуру #1
из файла нужно считать данные и записать их в структуру.

данные из файла:
Кликните здесь для просмотра всего текста
Петров П.П.
С++ для чайников
2000
Программирование

Петров П.П.
С++ для чайников
2000
Программирование


пример структуры:
C++
1
2
3
4
5
6
7
struct backlist
{
    char author[41];
    char name[81];
    int yop;
    char spec[41];
} ;
Как правильно считать каждую строку??? так чтобы в члене структуры не было записано лишних знаков (Типа '\n');
и после считывания блока пропустить пустую строку (она разделяет информационные блоки)

я считывал таким образом:
C++
1
2
3
4
fgets(dir[i].author, 40, f);
fgets(dir[i].name, 80, f);
fscanf(f, "%d", &dir[i].yop);
fgets(dir[i].spec, 40, f);
и в последний член структуры ничего не записывается.

Добавлено через 38 минут
Как считать данные из данного файла, в данную структуру??
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2013, 17:45     Считывание данных из файла в структуру
Посмотрите здесь:

считывание данных из файла C++
считывание данных из файла C++
Считывание данных из файла C++
считывание данных из файла в C++ C++
Считывание данных с файла C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.05.2013, 18:00     Считывание данных из файла в структуру #2
C++
1
2
3
4
5
fgets(dir[i].author, 40, f);
fgets(dir[i].name, 80, f);
fscanf(f, "%d", &dir[i].yop);
fgetc(f);
fgets(dir[i].spec, 40, f);
Цитата Сообщение от sd710 Посмотреть сообщение
и после считывания блока пропустить пустую строку (она разделяет информационные блоки)
Пустую строку убрать. Она там ни к чему, лишние проблемы.
sd710
1 / 1 / 0
Регистрация: 19.12.2012
Сообщений: 23
26.05.2013, 18:02  [ТС]     Считывание данных из файла в структуру #3
Цитата Сообщение от alsav22 Посмотреть сообщение
Пустую строку убрать. Она там ни к чему, лишние проблемы.
Допустим ладно. я ее уберу. хотя таково условие.
У меня все равно не получается считать данные из файла в структуру.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.05.2013, 18:11     Считывание данных из файла в структуру #4
Цитата Сообщение от sd710 Посмотреть сообщение
У меня все равно не получается считать данные из файла в структуру.
Что конкретно? Код покажите.
Цитата Сообщение от sd710 Посмотреть сообщение
в последний член структуры ничего не записывается
Это исправилось?
Цитата Сообщение от sd710 Посмотреть сообщение
хотя таково условие
Если условие, то читайте строку во временный массив char.
sd710
1 / 1 / 0
Регистрация: 19.12.2012
Сообщений: 23
26.05.2013, 18:19  [ТС]     Считывание данных из файла в структуру #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
struct backlist
{
    char author[41];
    char name[81];
    int yop;
    char spec[41];
} dir[n];
 
int main()
{
    FILE *f=fopen("file.txt", "r");
    int i=0;
    fgets(dir[i].author, 40, f);
    fgets(dir[i].name, 80, f);
    fscanf(f, "%d", &dir[i].yop);
    fgets(dir[i].spec, 40, f);
 
    cout << dir[i].author
        << dir[i].name
        << dir[i].yop
        << dir[i].spec << endl;
    fclose(f);
    system("pause");
    return 0;
}
данные в файле:
Кликните здесь для просмотра всего текста
Petrov P.P.
Name Name
1966
bla bla

печать структуры:
Petrov P.P.
Name Name
1966
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.05.2013, 18:25     Считывание данных из файла в структуру #6
Цитата Сообщение от alsav22 Посмотреть сообщение
fgets(dir[i].author, 40, f);
fgets(dir[i].name, 80, f);
fscanf(f, "%d", &dir[i].yop);
fgetc(f);
fgets(dir[i].spec, 40, f);
Я это для кого написал?
sd710
1 / 1 / 0
Регистрация: 19.12.2012
Сообщений: 23
26.05.2013, 18:32  [ТС]     Считывание данных из файла в структуру #7
оооо. кажется мне нужен отдых. спасибо большое.

Добавлено через 2 минуты
есть еще один вопрос.
считывая строку в член структуры (символьный массив) дописывается в конец массива '\n' - это можно как-то исправить?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.05.2013, 18:36     Считывание данных из файла в структуру #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
#include <iostream>
using namespace std;
 
const int n = 3;
 
struct backlist
 {
    char author[41];
    char name[81];
    int yop;
    char spec[41];
} dir[n];
 
int main()
{
    FILE *f=fopen("file.txt", "r");
    while (1)
    {
        int i=0;
        char temp[80];
        fgets(dir[i].author, 40, f);
        if (feof(f)) break;
        fgets(dir[i].name, 80, f);
        fscanf(f, "%d", &dir[i].yop);
        fgetc(f);
        fgets(dir[i].spec, 40, f);
        fgets(temp, 80, f);
 
        cout << dir[i].author
             << dir[i].name
             << dir[i].yop << endl
             << dir[i].spec << endl;
        ++i;
    }
    fclose(f);
    
    system("pause");
    return 0;
}
Цитата Сообщение от sd710 Посмотреть сообщение
считывая строку в член структуры (символьный массив) дописывается в конец массива '\n' - это можно как-то исправить?
Можно. Сейчас добавлю как.
Миниатюры
Считывание данных из файла в структуру  
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.05.2013, 18:45     Считывание данных из файла в структуру #9
Вот так можно. Т.е. записать на место '\n' терминальный '\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
#include <iostream>
using namespace std;
 
const int n = 3;
 
struct backlist
 {
    char author[41];
    char name[81];
    int yop;
    char spec[41];
} dir[n];
 
int main()
{
    FILE *f=fopen("file.txt", "r");
    while (1)
    {
        int i=0;
        char temp[80];
        fgets(dir[i].author, 40, f);
        if (feof(f)) break;
        fgets(dir[i].name, 80, f);
        fscanf(f, "%d", &dir[i].yop);
        fgetc(f);
        fgets(dir[i].spec, 40, f);
        fgets(temp, 80, f);
        
        dir[i].author[strlen(dir[i].author) - 1] = '\0';
        dir[i].name[strlen(dir[i].name) - 1] = '\0';
        dir[i].spec[strlen(dir[i].spec) - 1] = '\0';
        
        cout << dir[i].author << endl
             << dir[i].name << endl
             << dir[i].yop << endl
             << dir[i].spec << endl << endl;
        ++i;
    }
    fclose(f);
    
    system("pause");
    return 0;
}
sd710
1 / 1 / 0
Регистрация: 19.12.2012
Сообщений: 23
26.05.2013, 18:47  [ТС]     Считывание данных из файла в структуру #10
аа. все понятно. спасибо большое)
vladimir_Ronny
1 / 1 / 1
Регистрация: 13.06.2015
Сообщений: 76
22.06.2015, 17:54     Считывание данных из файла в структуру #11
Добрый день!
Я сейчас пытаюсь решить подобную задачу. И поэтому оказался в этой старой теме...

Моя задача следующая: нужно из файла перевести в структуру следующую информацию:
- автор
- название
- страна, в которой издана книга.

В общем-то та программа, которая написана сверху, мне очень хорошо подходит.
Есть только два "но":
1. Она почему-то считывает только три строки. Я пробовал менять n, не помогает.
2. Я не могу понять, почему строчка "if (feof(f)) break;" стоит в середине цикла, а не в начала или конце.

Вот текст файла, который я пытаюсь преобразовать в структуру:

ivanov Gusi Moscow
petrov Lebedi Peterburg
pushkin skazka Petrograd
lermontov parus samara

Также привожу переделанный под свое задание код.

Очень прошу помочь!

C++ (Qt)
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
#include <stdio.h>
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <math.h>
 
const int n = 100;
 
struct backlist
 {
    char author[81];
    char name[81];
    char spec[81];
} dir[n];
 
int main()
{
    FILE *f=fopen("file.txt", "r");
    while (1)
    {
        int i=0;
        fgets(dir[i].author, 80, f);
        if (feof(f)) break;
        fgets(dir[i].name, 80, f);
        fgets(dir[i].spec, 80, f);
        
        cout << dir[i].author << endl
             << dir[i].name << endl
             << dir[i].spec << endl << endl;
        ++i;
         }
    fclose(f);
    return 0;
}
lss
919 / 849 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
22.06.2015, 19:20     Считывание данных из файла в структуру #12
Цитата Сообщение от vladimir_Ronny Посмотреть сообщение
Вот текст файла, который я пытаюсь преобразовать в структуру:
Посмотри, как у ТС данные в файле расположены, и как у тебя. Или расположи так же, или используй, для чтения, fscanf().
Цитата Сообщение от vladimir_Ronny Посмотреть сообщение
2. Я не могу понять, почему строчка "if (feof(f)) break;" стоит в середине цикла, а не в начала или конце.
Чтобы выход из цикла был сразу при считывании EOF.
vladimir_Ronny
1 / 1 / 1
Регистрация: 13.06.2015
Сообщений: 76
22.06.2015, 19:47     Считывание данных из файла в структуру #13
Цитата Сообщение от lss Посмотреть сообщение
Посмотри, как у ТС данные в файле расположены, и как у тебя. Или расположи так же, или используй, для чтения, fscanf().

Чтобы выход из цикла был сразу при считывании EOF.
У меня данные в файле расположены точно также. Я всего лишь убрал из программы лишние данные, так как мое и его задания отличаются.

Если заменить функцию на fscanf, то тогда вообще ничего на экран не выводится. Лишь появляется сообщения "Для продолжения нажмите любую кнопку..."

C++ (Qt)
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
#include <stdio.h>
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <math.h>
 
const int n = 1;
 
struct backlist
 {
    char author[81];
    char name[81];
    char spec[41];
} dir[n];
 
int main()
{
    FILE *f=fopen("file.txt", "r");
    int i=0;
    while (i<5)
    {
        fscanf(f,"%d",&dir[i].author);
        if (feof(f)) break;
        fscanf(f,"%d",&dir[i].name);
        fscanf(f,"%d",&dir[i].spec);
        
 
        cout << dir[i].author << " ";
        cout << dir[i].name << " ";
        cout << dir[i].spec << endl;
        ++i;
    }
    fclose(f);
    
    return 0;
}
lss
919 / 849 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
22.06.2015, 20:52     Считывание данных из файла в структуру #14
Цитата Сообщение от vladimir_Ronny Посмотреть сообщение
У меня данные в файле расположены точно также.
То есть, по-твоему, это так же?
Структрура:
C++
1
2
3
4
5
6
struct backlist
{
    char author[81];
    char name[81];
    char spec[41];
};
Её расположение в файле, такое (как у тебя):
ivanov Gusi Moscow
Или такое (как у ТС):
ivanov
Gusi
Moscow
Для тебя - это одинаковое располоожение?

Добавлено через 53 минуты
Цитата Сообщение от vladimir_Ronny Посмотреть сообщение
"%d"
Тип данных какой читаешь?
vladimir_Ronny
1 / 1 / 1
Регистрация: 13.06.2015
Сообщений: 76
22.06.2015, 21:04     Считывание данных из файла в структуру #15
Цитата Сообщение от lss Посмотреть сообщение
Тип данных какой читаешь?
char
lss
919 / 849 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
22.06.2015, 21:13     Считывание данных из файла в структуру #16
Цитата Сообщение от vladimir_Ronny Посмотреть сообщение
char
А тебе нужно char читать или массив chr (строку)? По-твоему, это одно и то же? И, по-твоему, это формат для char?
Цитата Сообщение от vladimir_Ronny Посмотреть сообщение
"%d"
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2015, 21:31     Считывание данных из файла в структуру
Еще ссылки по теме:

C++ Считывание данных из файла
Считывание данных из текстового файла в структуру C++
Считывание информации из файла в структуру C++

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

Или воспользуйтесь поиском по форуму:
vladimir_Ronny
1 / 1 / 1
Регистрация: 13.06.2015
Сообщений: 76
22.06.2015, 21:31     Считывание данных из файла в структуру #17
Цитата Сообщение от lss Посмотреть сообщение
А тебе нужно char читать или массив chr (строку)?
Считать нужно каждое слово отдельно
Yandex
Объявления
22.06.2015, 21:31     Считывание данных из файла в структуру
Ответ Создать тему
Опции темы

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