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

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

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

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

13.02.2013, 10:38. Просмотров 1606. Ответов 22
Метки нет (Все метки)

Доброго времени суток!

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

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

Считывание файла в массив и запись нового файла - C++
Консоль VS C++. Текстовый файл открывается как бинарный, и считывается по 100 байт в массив - и сразу они переписываются в другой файл. В...

Массив структур из файла - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;conio.h&gt; #include &lt;iomanip&gt; #include &lt;stdlib.h&gt; #include &lt;cstring&gt; #include...

Массив структур из файла - C++
Помогите, пожалуйста, с поиском ошибки. Нам дан текстовый файл, из 3 столбцов и 5 строк, с разделителями в виде пробелов и новой строки -...

Считывание в массив с файла - C++
Как считать числа из файла в массив, но сделать это со второй строки? К примеру: 6 10 12 63 25 23 И мне нужно просто пропустить...

Считывание из файла в массив - C++
#include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main() { FILE*...

22
zerO2hacK
1 / 1 / 0
Регистрация: 06.03.2012
Сообщений: 72
14.02.2013, 00:16  [ТС] #16
Цитата Сообщение от alsav22 Посмотреть сообщение
здесь не добавил "!" перед f.eof()
читает, но только 1 запись matan.
а точнее выводится только она.

Добавлено через 36 секунд
сейчас отладку делаю, смотрю что не так.

Добавлено через 3 минуты
Цитата Сообщение от alsav22 Посмотреть сообщение
Сейчас читает?
да. читает только 1 запись matan, вторую не записывает, причем в disciplines[0] - запись matan, в disciplines[1] - ничего нет, и таких disciplines[i] уже 25....цикл долго идет что то...
0
zerO2hacK
1 / 1 / 0
Регистрация: 06.03.2012
Сообщений: 72
14.02.2013, 00:19  [ТС] #17
вот
0
Миниатюры
Считывание из файла в массив структур  
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.02.2013, 00:21 #18
Код, который пробуете, покажите.
1
zerO2hacK
1 / 1 / 0
Регистрация: 06.03.2012
Сообщений: 72
14.02.2013, 00:41  [ТС] #19
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void fload(){
    clear();//чистим всю структуру
    char name[10];
    cout<<"Введите имя файла - ";cin>>name;
    ifstream f;
    f.open(name);
    //
    for (int i=0; !f.eof(); i++){
        f.getline(disciplines[i].name,10);//считываем строку
        f>>disciplines[i].num_course;;
        f>>disciplines[i].num_term;
        f>>disciplines[i].am_lec;
        f>>disciplines[i].am_pr;
        f>>disciplines[i].am_lab;
        f>>disciplines[i].am_one;
        f>>disciplines[i].am_ALL;
        f>>disciplines[i].form;
    }
    //
    f.close();
    cout<<"Данные успешно считаны! Можете начать работу с ними."<<endl;
}
Добавлено через 2 минуты
или весь надо?

Добавлено через 17 минут
Цитата Сообщение от alsav22 Посмотреть сообщение
Код, который пробуете, покажите.
ждал ждал ответа...не дождался
ок. я сам тогда спать пойду. спасибо огромное за такие подсказки!!
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.02.2013, 01:48 #20
Так должно работать:
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
void fload(){
    clear();//чистим всю структуру
    char name[10];
    cout<<"Введите имя файла - ";cin>>name;
    ifstream f;
    f.open(name);
    //
    for (int i=0; ; i++){
        f.getline(disciplines[i].name,10);//считываем строку
        if (f.eof()) break;
        f>>disciplines[i].num_course;;
        f>>disciplines[i].num_term;
        f>>disciplines[i].am_lec;
        f>>disciplines[i].am_pr;
        f>>disciplines[i].am_lab;
        f>>disciplines[i].am_one;
        f>>disciplines[i].am_ALL;
        f>>disciplines[i].form;
        f.get();
    }
    //
    f.close();
    cout<<"Данные успешно считаны! Можете начать работу с ними."<<endl;
}
1
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{
              ...
        }
0
alsav22
5428 / 4823 / 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;
Предполагается, что если существует, то откроется.
1
zerO2hacK
1 / 1 / 0
Регистрация: 06.03.2012
Сообщений: 72
15.02.2013, 21:08  [ТС] #23
точно...есть же еще .is_open(), проверяющая открыт ли файл.

огромнейшее спасибо! все понятно объяснил! очень помог!
0
15.02.2013, 21:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.02.2013, 21:08
Привет! Вот еще темы с ответами:

Считывание из файла в массив - C++
Задание: Дан в файл в котором записана матрица вершин, необходимых для создания 3D фигуры. Написать программу, которая считывает данную...

Считывание файла в массив - C++
Здравствуйте Мне была поставлена задача сделать рандомный выбор строк из файла. И я не знаю как считать из файла строки в массив что бы к...

Заполнить из файла массив структур - C++
задача такая файле есть данные которые имеют Количество строк: 5. Столбцы: Фамилия, Место жительства, Год рождения. Определить ...

Считать массив структур из файла - C++
Видела похожие темы, но так и не дошло:( В общем, количество структур в файле мне известно. Нужно считать их в массив. Проблема в том,...


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

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

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