Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
sd710
1 / 1 / 0
Регистрация: 19.12.2012
Сообщений: 23
#1

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

26.05.2013, 17:45. Просмотров 1234. Ответов 16
Метки нет (Все метки)

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

данные из файла:
Кликните здесь для просмотра всего текста
Петров П.П.
С++ для чайников
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 минут
Как считать данные из данного файла, в данную структуру??
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2013, 17:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Считывание данных из файла в структуру (C++):

Считывание данных из текстового файла в структуру - C++
Программа не желает считывать данные из текстового файла, компилируется и работает норм, но как только нажму считать данные из файла, то...

Считывание из файла в структуру - C++
Добрый день, столкнулся с такой проблемой. Есть файл со строками из 1 и 0 Пример: 1111110 1111000 1001011 ... Все строки...

Считывание информации из файла в структуру - C++
Добрый день! Помогите, пожалуйста, с решением задачи. Дан символьный файл f, содержащий сведения о студентах, записанные по...

Считывание всей строки из файла в структуру - C++
Привет. Есть программа, считывающая из файла некоторые данные про рабочих и вывод их на экран с использованием структуры. Проблема...

Считывание смешанной строки из файла в структуру - C++
Формат файла и данные записываемые структурной формой такие: Первое ФИО 1 | ж | 2001 | Минск | Неизвестное заболевание | 80291111111 ...

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

16
alsav22
5426 / 4821 / 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 Посмотреть сообщение
и после считывания блока пропустить пустую строку (она разделяет информационные блоки)
Пустую строку убрать. Она там ни к чему, лишние проблемы.
1
sd710
1 / 1 / 0
Регистрация: 19.12.2012
Сообщений: 23
26.05.2013, 18:02  [ТС] #3
Цитата Сообщение от alsav22 Посмотреть сообщение
Пустую строку убрать. Она там ни к чему, лишние проблемы.
Допустим ладно. я ее уберу. хотя таково условие.
У меня все равно не получается считать данные из файла в структуру.
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.05.2013, 18:11 #4
Цитата Сообщение от sd710 Посмотреть сообщение
У меня все равно не получается считать данные из файла в структуру.
Что конкретно? Код покажите.
Цитата Сообщение от sd710 Посмотреть сообщение
в последний член структуры ничего не записывается
Это исправилось?
Цитата Сообщение от sd710 Посмотреть сообщение
хотя таково условие
Если условие, то читайте строку во временный массив char.
1
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
0
alsav22
5426 / 4821 / 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);
Я это для кого написал?
1
sd710
1 / 1 / 0
Регистрация: 19.12.2012
Сообщений: 23
26.05.2013, 18:32  [ТС] #7
оооо. кажется мне нужен отдых. спасибо большое.

Добавлено через 2 минуты
есть еще один вопрос.
считывая строку в член структуры (символьный массив) дописывается в конец массива '\n' - это можно как-то исправить?
0
alsav22
5426 / 4821 / 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' - это можно как-то исправить?
Можно. Сейчас добавлю как.
1
Миниатюры
Считывание данных из файла в структуру  
alsav22
5426 / 4821 / 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;
}
1
sd710
1 / 1 / 0
Регистрация: 19.12.2012
Сообщений: 23
26.05.2013, 18:47  [ТС] #10
аа. все понятно. спасибо большое)
0
vladimir_Ronny
1 / 1 / 1
Регистрация: 13.06.2015
Сообщений: 78
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;
}
0
lss
921 / 850 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
22.06.2015, 19:20 #12
Цитата Сообщение от vladimir_Ronny Посмотреть сообщение
Вот текст файла, который я пытаюсь преобразовать в структуру:
Посмотри, как у ТС данные в файле расположены, и как у тебя. Или расположи так же, или используй, для чтения, fscanf().
Цитата Сообщение от vladimir_Ronny Посмотреть сообщение
2. Я не могу понять, почему строчка "if (feof(f)) break;" стоит в середине цикла, а не в начала или конце.
Чтобы выход из цикла был сразу при считывании EOF.
0
vladimir_Ronny
1 / 1 / 1
Регистрация: 13.06.2015
Сообщений: 78
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;
}
0
lss
921 / 850 / 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"
Тип данных какой читаешь?
0
vladimir_Ronny
1 / 1 / 1
Регистрация: 13.06.2015
Сообщений: 78
22.06.2015, 21:04 #15
Цитата Сообщение от lss Посмотреть сообщение
Тип данных какой читаешь?
char
0
22.06.2015, 21:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2015, 21:04
Привет! Вот еще темы с ответами:

Считывание данных из файла - C++
char y; ifstream fin; fin.open(&quot;maps1.txt&quot;); fin &gt;&gt; y; fin.close(); cout &lt;&lt; y; Почему-то не работает следующий код. В...

Считывание данных из файла - C++
// Laboratornaya_4.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include &quot;stdio.h&quot; #include...

Считывание данных из файла - C++
не могу считать данные из файла На вход программы подаются 365 строк, которые содержат информацию о среднесуточной температуре всех дней...

Считывание данных из файла - C++
почему не првильно работает считывание из файла? #include &lt;iostream.h&gt; #include &lt;conio.h&gt; #include &lt;malloc.h&gt; #include...


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

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

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