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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
zerO2hacK
1 / 1 / 0
Регистрация: 06.03.2012
Сообщений: 72
13.02.2013, 10:38     Считывание из файла в массив структур #1
Доброго времени суток!

Есть структура:
C++
1
2
3
4
5
6
7
8
9
10
11
struct iDiscipline{
        char name[10];
        int num_course;
        int num_term;
        int am_lec;
        int am_pr;
        int am_lab;
        int am_one;
        int am_ALL;
        char form[1]; //e-exam || t-test
}disciplines[MAX]={'\0'};
и файл типа:
Кол-во записей: 2
Номер: |0||1|
Наименование: |mat||ter|
Номер курса; |1||1|
Номер семестра: |1||1|
Лекции (ч): |1||1|
Практика (ч): |1||1|
Лабы (ч): |1||1|
Сам.раб. (ч): |1||1|
ВСЕГО (ч): |4||4|
Форма отчета: |t||e|
и функция считывания из файла:
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
void fload(){
    clear();//чистим всю структуру
    int am=0;
    char name[10];
    cout<<"Введите имя файла - ";cin>>name;
    ifstream f;
    f.open(name);
    //
    f.seekg(16)>>am;
    //for (int i=0; i<am; i++) f.seekg(36+i)>>"| ">>i>>"  |";
    int dop=0;
    for (int i=0; i<am; i++){
        int j=0;
        do f.seekg(51+3*am+i+1)>>disciplines[i].name[j++]; while (f>>"|");
        dop+=j;
    }
    for (int i=0; i<am; i++) f.seekg(68+2*am+dop+i+1)>>disciplines[i].num_course;
    for (int i=0; i<am; i++) f.seekg(85+3*am+dop+i+1)>>disciplines[i].num_term;
    for (int i=0; i<am; i++) f.seekg(102+4*am+dop+i+1)>>disciplines[i].am_lec;
    for (int i=0; i<am; i++) f.seekg(119+5*am+dop+i+1)>>disciplines[i].am_pr;
    for (int i=0; i<am; i++) f.seekg(136+6*am+dop+i+1)>>disciplines[i].am_lab;
    for (int i=0; i<am; i++) f.seekg(153+7*am+dop+i+1)>>disciplines[i].am_one;
    for (int i=0; i<am; i++) f.seekg(170+8*am+dop+i+1)>>disciplines[i].am_ALL;
    for (int i=0; i<am; i++) f.seekg(187+9*am+dop+i+1)>>disciplines[i].form[0];
    //
    f.close();
}
Сперва думал как мне перепрыгивать ненужные слова...сразу к числам, названиям - нашел функцию tellg()...пошаманил с ней чуток.

Выбивает ошибку в этом куске:
C++
1
2
3
4
5
for (int i=0; i<am; i++){
        int j=0;
        do f.seekg(51+3*am+i+1)>>disciplines[i].name[j++]; while (f>>"|");
        dop+=j;
    }
Мол, бинарный ">>": не найден оператор, принимающий левый операнд типа "std::ifstream" (или приемлемое преобразование отсутствует).

В чем косяк то, прошу помощи

Добавлено через 3 минуты
переменная am: кол-во записей
dop: это кол-во символов в названиях дисциплин

Добавлено через 5 минут
ну и на всякий, функция записи в файл:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void fsave(){
    char name[10];
    int am=0;
    cout<<"Введите имя файла - ";cin>>name;
    ofstream f;
    f.open(name);
    f<<"Кол-во записей: "; for (int i=0; i<MAX; i++) if (disciplines[i].name[0]) am++; f<<am<<endl;
    f<<"Номер:           "; for (int i=0; i<MAX; i++) {if (disciplines[i].name[0]) f<<"|"<<i<<"|";}
    f<<endl<<"Наименование:    "; for (int i=0; i<MAX; i++) {if (disciplines[i].name[0]) f<<"|"<<disciplines[i].name<<"|"; }
    f<<endl<<"Номер курса;     "; for (int i=0; i<MAX; i++) {if (disciplines[i].name[0]) f<<"|"<<disciplines[i].num_course<<"|";}
    f<<endl<<"Номер семестра:  "; for (int i=0; i<MAX; i++) {if (disciplines[i].name[0]) f<<"|"<<disciplines[i].num_term<<"|";}
    f<<endl<<"Лекции (ч):      "; for (int i=0; i<MAX; i++) {if (disciplines[i].name[0]) f<<"|"<<disciplines[i].am_lec<<"|"; }
    f<<endl<<"Практика (ч):    "; for (int i=0; i<MAX; i++) {if (disciplines[i].name[0]) f<<"|"<<disciplines[i].am_pr<<"|"; }
    f<<endl<<"Лабы (ч):        "; for (int i=0; i<MAX; i++) {if (disciplines[i].name[0]) f<<"|"<<disciplines[i].am_lab<<"|";}
    f<<endl<<"Сам.раб. (ч):    "; for (int i=0; i<MAX; i++) {if (disciplines[i].name[0]) f<<"|"<<disciplines[i].am_one<<"|"; }
    f<<endl<<"ВСЕГО (ч):       "; for (int i=0; i<MAX; i++) {if (disciplines[i].name[0]) f<<"|"<<disciplines[i].am_ALL<<"|";}
    f<<endl<<"Форма отчета:    "; for (int i=0; i<MAX; i++) {if (disciplines[i].name[0]) f<<"|"<<disciplines[i].form[0]<<"|";}
    f<<endl;
    f.close();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2013, 10:38     Считывание из файла в массив структур
Посмотрите здесь:

Считать массив структур из файла C++
Считывание из файла в массив C++
C++ Считывание чисел из файла в массив
Считывание из файла в массив строк C++
Считать массив структур из файла C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zerO2hacK
1 / 1 / 0
Регистрация: 06.03.2012
Сообщений: 72
15.02.2013, 20:41  [ТС]     Считывание из файла в массив структур #21
Цитата Сообщение от alsav22 Посмотреть сообщение
Так должно работать:
блин...огромнейшее спасибо тебе друг!
все и правда работает!

только вот одного момента не понял...
Цитата Сообщение от alsav22 Посмотреть сообщение
f.getline(disciplines[i].name,10);//считываем строку
* * * * if (f.eof()) break;
почему сперва считываем строку, а только потом проверяем на конец файла?

Добавлено через 8 минут
и не могу найти аналог функции access(), чтобы проверить существует ли введенный файл,
C++
1
2
3
4
5
if (access(name,0)==-1)
        cout<<endl<<"Ошибка! Файл не найден!"<<endl;
    else{
              ...
        }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.02.2013, 20:59     Считывание из файла в массив структур #22
Цитата Сообщение от zerO2hacK Посмотреть сообщение
почему сперва считываем строку, а только потом проверяем на конец файла?
Конец файла нужно сначала считать, а потом обработать это. В ЭТОМ коде, считает конец файла именно getline()(из-за того, что перед символом конца файла стоит '\n'). Если поставить проверку на конец файла в for(), то после того, как getline() считает конец файла, будут попытки чтения до тех пор, пока код не дойдёт до проверки условия в for(), и только потом будет выход из цикла. Это не нужно, поэтому проверку на конец файла лучше поставить сразу после getline().

Добавлено через 3 минуты
Цитата Сообщение от zerO2hacK Посмотреть сообщение
и не могу найти аналог функции access(), чтобы проверить существует ли введенный файл,
Аналога нет. Проверяют просто открытие для чтения:
C++
1
2
ifstream f(name);
if (!f.is_open()) cout << "Ошибка открытия файла для чтения!" << endl;
Предполагается, что если существует, то откроется.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.02.2013, 21:08     Считывание из файла в массив структур
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
zerO2hacK
1 / 1 / 0
Регистрация: 06.03.2012
Сообщений: 72
15.02.2013, 21:08  [ТС]     Считывание из файла в массив структур #23
точно...есть же еще .is_open(), проверяющая открыт ли файл.

огромнейшее спасибо! все понятно объяснил! очень помог!
Yandex
Объявления
15.02.2013, 21:08     Считывание из файла в массив структур
Ответ Создать тему
Опции темы

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