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

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

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

Сохранение и чтение из файла (база данных) - C++

05.01.2017, 23:02. Просмотров 358. Ответов 16
Метки нет (Все метки)

Добрый Вечер дорогой форум!
Огромный поклон за помощь таким новичкам как я!
Всегда нахожу то что нужно, но не в данном частном случае.
Пишу курсовик, который как всегда горит (надо сдать 9 числа)
Столкнулся с проблемой считывания из файла:
Перебрал уже все что мог...пересмотрел тучу видео...где-то лажаю, не могу понять.
Собственно-
Для начала Структура - Библиотека и класс КнижнаяПолка:
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
struct Library //Основная структура
{
    char genre[20]; //Жанр Литературы
    char author[30]; //Автор
    char title[50]; //Название книги
    char year[30]; //Год Выпуска
    int quantity; //Количество книг
};
 
class Bookshelf //Класс динамический массив структур
{
private:
    int n; //число строк в массиве
    Library* px; //указатель на массив записей
    void deleteline(int j); //вспомогательная операция к функции удаления строки в массиве.
 
public:
    Bookshelf()
    {
    }
 
    ~Bookshelf()
    {
        if (n != NULL)
            delete[] px;
    }
 
    int k;
    void create();
    void readfromfile();
    void viewCatalogue();
    void savetofile();
    void find();
    void adddata();
    void del();
    void correction();
    void sort();
    void tableheader(); //вид заголовков вывода таблицы
    void tablebody(); //вид вывода данных таблицы
};
Метод readfromfile() и savetofile()
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
void Bookshelf::savetofile()
{
    int i; //рабочая переменная для подсчёта
    ofstream fout;
    string NameFile; //переменная для названия файла
    if (px == NULL)
    {
        cout << "Catalogue is Empty\n";
        _getch();
        exit(1);
    }
    // cout << "Please Type File Name (add .txt):\n";
    system("cls");
    cin.get();
    cout << "Please Type File name:\n";
    // cin >> name;
    getline(cin, NameFile);
    NameFile += ".txt";
    fout.open(NameFile);
    if (fout.fail())
    {
        cout << NameFile << " Failed to create a file\n";
        _getch();
        n = 0;
        px = NULL;
        exit(1);
    }
    for (i = 0; i < n; i++)
    {
        fout << setw(2) << "" << setw(15) << "Genre"
             << " " << setw(15) << "Author"
             << " " << setw(5) << "Year"
             << " " << setw(10) << "Quantity"
             << " " << setw(30) << "Title" << endl;
        fout << i + 1 << "." << setw(3) << setw(15) << px[i].genre << " " << setw(16)
             << px[i].author << setw(5) << px[i].year << " " << setw(10) << px[i].quantity << " "
             << setw(30) << px[i].title << endl;
    }
    cout << "Library Catalogue has been saved to a file\n";
    _getch();
    fout.close();
}
Тут все сохраняется в папку проекта.

Но вот метод readfromfile() Хромает:
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
69
70
71
72
73
void Bookshelf::readfromfile()
{
    ifstream fin;
    string NameFile; //переменная для названия файла
    // FILE *fp = fopen(name, "r"); //тут пытался через fgets
    int i; //рабочая переменная для подсчёта
    Library u; //рабочая переменная для подсчёта записей в файле
    if (px != NULL)
    {
        delete[] px;
        n = 0;
        px = NULL;
    } //очистка рабочей области
    system("cls");
    cin.get();
    cout << "Type File name:\n";
    // cin >> name;
    getline(cin, NameFile);
    NameFile += ".txt";
    fin.open(NameFile);
    // if (NULL == fp)
    if (!fin.is_open())
    {
        cout << NameFile << "File is not found" << endl;
        _getch();
        exit(1);
    }
    n = 0;
    //подсчёт записей в файле
    do
    {
        fin >> u.genre >> u.author >> u.year >> u.quantity >> u.title;
        n++;
    } while (fin.good()); //пока файл не закончился
 
    // char str[1024] = "";
    // while (!feof(fp)) //Пока не конец файла fp
    //{
    // fgets(str, 1024, fp); //построчное считывание
    // printf("%s", str);
    //}
    // fclose(fp);
 
 
    n--;
    fin.close();
 
    px = new Library[n]; //выделение динамической памяти
 
    if (px == NULL)
 
    {
        cout << "Not Enough Memory";
        _getch();
        return;
        exit(1);
    }
    fin.open(NameFile);
    if (!fin.is_open())
    {
        cout << NameFile << "File does not exists";
        _getch();
        exit(1);
    }
    //ввод массива из файла
    for (i = 0; i < n; i++)
    {
        fin >> px[i].genre >> px[i].author >> px[i].year >> px[i].quantity >> px[i].title;
    }
    fin.close();
    int sravn(Library x, Library y);
    viewCatalogue();
}
В общем не работает... Помогите. Голова уже как арбуз ))
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2017, 23:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сохранение и чтение из файла (база данных) (C++):

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

Чтение и сохранение JPEG файла - C++
Как прочитать файл формата .jpg, а потом обработанное(уже мной!) сохранить???

Сохранение и чтение объекта класса в файл/из файла - C++
Добрый день! Столкнулся с проблемой сохранения объекта класса в файл, и последующего его чтения. Задача такая: имеем vector base, в...

Сохранение и чтение структуры из файла (crash программы) - C++
Есть структура cars, над которой нужно произвести несколько операций, в том числе - и сохранение и открытие из файла. enum...

Работа со структурой данных, чтение/сохранение во внешний файл - C++
помогите разобраться с задачкой!! {Написать программу, представляющую собой простейшую систему для управления данными. Исходные данные...

Преобразование текстового файла в двоичный и чтение исходных данных из двоичного файла. - C++
#include&lt;iostream&gt; #include&lt;fstream&gt; #include&lt;locale.h&gt; #include&lt;iomanip&gt; #include &lt;cstdlib&gt; using namespace std; struct...

16
nd2
2414 / 2003 / 705
Регистрация: 29.01.2016
Сообщений: 6,552
05.01.2017, 23:09 #2
Цитата Сообщение от Scalpel Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
for (i = 0; i < n; i++)
{
    fout << setw(2) << "" << setw(15) << "Genre"
         << " " << setw(15) << "Author"
         << " " << setw(5) << "Year"
         << " " << setw(10) << "Quantity"
         << " " << setw(30) << "Title" << endl;
    fout << i + 1 << "." << setw(3) << setw(15) << px[i].genre << " " << setw(16) << px[i].author
         << setw(5) << px[i].year << " " << setw(10) << px[i].quantity << " " << setw(30)
         << px[i].title << endl;
}
Не нужно в файл лишнее записывать, записывай только данные: в каждой строке - одно поле структуры.
1
Scalpel
0 / 0 / 0
Регистрация: 02.01.2017
Сообщений: 10
05.01.2017, 23:15  [ТС] #3
То есть заголовки не нужны, и номера строк не нужны? Буду копать в данном направлении. Не обижусь если поможете выкинуть все лишнее. Просто уже 10 часов пишу...Вот на этих двух методах споткнулся...Остальное вроде работает.
Еще раз извините если что не так...Горит ж...(2 работы еще и универ )
0
nd2
2414 / 2003 / 705
Регистрация: 29.01.2016
Сообщений: 6,552
05.01.2017, 23:22 #4
Цитата Сообщение от Scalpel Посмотреть сообщение
То есть заголовки не нужны, и номера строк не нужны?
Только данные, в каждой строке - одно поле структуры. При чтении будешь читать построчно.
C++
1
px[i].genre << endl << px[i].author << endl << ...// и т.д.
Добавлено через 1 минуту
И записывай их в том порядке, как они в структуре расположены, меньше путаницы будет.
1
Scalpel
0 / 0 / 0
Регистрация: 02.01.2017
Сообщений: 10
05.01.2017, 23:52  [ТС] #5
Да переделал метод сохранения- оставил 1 строку.
C++
1
fout << setw(15) << px[i].genre << " " << setw(16) << px[i].author << setw(5) << px[i].year << " " << setw(10) << px[i].quantity << " " << setw(30) << px[i].title << endl;
Теперь считывает
Но есть 1 проблема Title у меня состоит из нескольких слов... Он берет только 1

Использовал
C++
1
 cin.getline(s[n].title, 50);
при вводе

Добавлено через 27 минут
Отдельно

C++
1
 fin.getline(px[i].title, 30);
не помог )
Можно как-то эту проблему решить?
0
nd2
2414 / 2003 / 705
Регистрация: 29.01.2016
Сообщений: 6,552
06.01.2017, 00:15 #6
Цитата Сообщение от Scalpel Посмотреть сообщение
Можно как-то эту проблему решить?
Можно. Данные в файл запиши, как я тебе советовал. setw() - это тоже лишнее.

Добавлено через 2 минуты
...
Цитата Сообщение от nd2 Посмотреть сообщение
C++
1
fout << px[i].genre << endl << px[i].author << endl << ...// и т.д.
И записывай их в том порядке, как они в структуре расположены, меньше путаницы будет.
Добавлено через 12 минут
Потом покажи цикл записи и цикл чтения.
1
Scalpel
0 / 0 / 0
Регистрация: 02.01.2017
Сообщений: 10
06.01.2017, 17:35  [ТС] #7
Получилось, огромное спасибо!
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
void Bookshelf::readfromfile()
{
    ifstream fin;
    string NameFile;//переменная для названия файла
    //FILE *fp = fopen(name, "r");
    int i;      //рабочая переменная для подсчёта
    Library u;    //рабочая переменная для подсчёта записей в файле
    if (px != NULL) { delete[]px; n = 0; px = NULL; }  //очистка рабочей области
    system("cls");
    cin.get();
    cout << "Type File name:\n";
    //cin >> name;
    getline(cin, NameFile);
    NameFile += ".txt";
    fin.open(NameFile);
    //if (NULL == fp)   
    if (!fin.is_open())
    {
        cout << NameFile << "File is not found" << endl;
        _getch();
        exit(1);
    }
    n = 0;
    //подсчёт записей в файле
    do {
        fin >> u.genre >> u.author >> u.year >> u.quantity;
        fin.getline(u.title, 22);  //название состоит из нескольких слов
    n++;
    }
   while (fin.good()); //пока файл не закончился
    n--;              
    fin.close();
                   px = new Library[n]; //выделение динамической памяти
    if (px == NULL)
    {
    cout << "Not Enough Memory";
    _getch();
     exit(1);
    }
    fin.open(NameFile);
    if (!fin.is_open())
    {
    cout << NameFile << "File does not exists";
    _getch();
    exit(1);
    }
    //ввод массива из файла
    for (i = 0; i < n; i++)
    {
        fin >> px[i].genre >> px[i].author >> px[i].year >> px[i].quantity;// >> px[i].title;
        fin.getline(px[i].title, 22);
     }
    fin.close();
}
Добавлено через 2 минуты
В записи оставил только:

C++
1
fout << px[i].genre << " " << px[i].author << " " << px[i].year << " " << px[i].quantity << " " << px[i].title << endl;
0
nd2
2414 / 2003 / 705
Регистрация: 29.01.2016
Сообщений: 6,552
06.01.2017, 17:55 #8
Цитата Сообщение от Scalpel Посмотреть сообщение
Получилось
А то, что перед title появится пробел, после чтения из файла, ничего?
1
Scalpel
0 / 0 / 0
Регистрация: 02.01.2017
Сообщений: 10
06.01.2017, 18:18  [ТС] #9
) Я понял и " " убрать
0
nd2
2414 / 2003 / 705
Регистрация: 29.01.2016
Сообщений: 6,552
06.01.2017, 18:21 #10
Цитата Сообщение от Scalpel Посмотреть сообщение
Я понял и " " убрать
Зато я не понял... Где что "и " " убрать"?
0
Scalpel
0 / 0 / 0
Регистрация: 02.01.2017
Сообщений: 10
06.01.2017, 18:26  [ТС] #11
Вот еще 1 грабли нашел
При добавлении нескольких записей, 2 раза надо жать на "2" (Yes и No ) вызывается 2 раза..
nd2, помогите плз...

И Еще 1 вопрос про методы в отдельный файл.
Каждый метод надо сохранять как отдельный файл.
Уже создал заголовочный файл, кинул туда класс и структуру, подключил в главном файле заголовок
Методы так-же выносятся?


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
void Bookshelf::adddata() //Menu 4 Working (Do while repair) 
{
    int i;
    Library *s; //указатель, для сохранения адреса исходного массива
    s = new Library[n + 1]; //выделение динамической памяти
    for (i = 0; i < n; i++)
        s[i] = px[i];  //сохранение адреса исходного массива
    cout << "Please enter information:\n\n";
    cout << "Enter Genre:\n"; cin >> s[n].genre;
    cout << "Enter Author:\n"; cin >> s[n].author;
    cout << "Enter Year:\n"; cin >> s[n].year;
    cout << "Enter Quantity:\n"; cin >> s[n].quantity;
    cout << "Enter Book Title:\n"; cin.ignore(256, '\n'); cin.getline(s[n].title, 22);
    cout << endl;
    n++;
    delete[]px; //удаление предыдущего массива
    px = s;
    cout << "New record has been added!\n";
    do {
        cout << "Would you like to add a record?\n";
        cout << "1 - Yes\n";
        cout << "2-No\n";
        cin >> i;
        if (i != 1)
        { 
            break;
        }
        adddata();
    } while (i == 1);
 
}
Добавлено через 2 минуты
Я думал он записывает тут пробел: (метод Savetofile)
C++
1
fout << px[i].genre << " " << px[i].author << " " << px[i].year << " " << px[i].quantity << " " << px[i].title << endl;
и спасибо Вам огромное, Вы мне очень здорово помогаете. Без Вас не успел-бы. Сейчас еще алгоритмы перерисовать...
Потом буду добавлять еще 1 структуру...и класс...
0
nd2
2414 / 2003 / 705
Регистрация: 29.01.2016
Сообщений: 6,552
06.01.2017, 18:29 #12
Цитата Сообщение от Scalpel Посмотреть сообщение
Я думал он записывает тут пробел: (метод Savetofile)
Записывает, и что?
0
Scalpel
0 / 0 / 0
Регистрация: 02.01.2017
Сообщений: 10
06.01.2017, 18:32  [ТС] #13
Да я понял, что я ошибся.
Уже проверил.
Где-же этот пробел тогда при считывании?
добавить fin.ignore(256, '\n'); ?
0
nd2
2414 / 2003 / 705
Регистрация: 29.01.2016
Сообщений: 6,552
06.01.2017, 18:36 #14
Цитата Сообщение от Scalpel Посмотреть сообщение
Да я понял, что я ошибся.
Уже проверил.
В чём ошибся? Что проверил?
Цитата Сообщение от Scalpel Посмотреть сообщение
Где-же этот пробел тогда при считывании?
Перед title должен быть. Разве его там нет? getline() пробелы не пропускает, в отличие от >>.
1
Scalpel
0 / 0 / 0
Регистрация: 02.01.2017
Сообщений: 10
06.01.2017, 18:41  [ТС] #15
добавить fin.ignore(256, '\n'); ?
Не верно,
Откуда-же этот пробел?
Вопрос не верный.
Как его убрать при записи? Чтоб потом считать?
0
06.01.2017, 18:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.01.2017, 18:41
Привет! Вот еще темы с ответами:

Чтение из файла определённого места и сортировка данных исходя из этих данных - C++
Есть некий текстовый документ, содержащий информацию о посещении сайта в формате: Например 12.5.76.200 04:23 Mon Цель:...

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

Чтение данных из файла - C++
Доброго времени, долго искал ответ, решил все таки спросить. Есть файл в котором такие данные TTT ppp 5 5 5 EEE aaa 3 3 3 DDD vvv 6...

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


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

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

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