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

Загрузка файла в массив - C++

Восстановить пароль Регистрация
 
Blueeyer
12 / 12 / 1
Регистрация: 09.10.2013
Сообщений: 220
08.04.2014, 00:11     Загрузка файла в массив #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
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include<iostream>
#include<string>
#include<fstream>
 
using namespace std;
 
struct Animal {
    int code;
    string name;
    double food;
};
 
enum { ADD = 1, NEW, EXIT };
 
void AddAnimals(Animal *animalDB, int size);
void ShowAnimals(Animal *animalDB, int size);
void Menu();
 
int main(){
    int size;
    cout<<"How much animals you want to add? ";
    cin>>size;
    Animal *animalDB = new Animal[size];
    AddAnimals(animalDB, size);
    ShowAnimals(animalDB, size);
// Открываем существующий (или создаем новый) файл, для записи элементов массива в него
    ofstream updateFile;
    bool menu = true;
    while (menu){
        int choice;
        Menu();
        cin>>choice;
        switch(choice){
        case ADD : updateFile.open("Animals.db", ios::out, ios::binary);
            menu = false;
            break;
        case NEW : updateFile.open("Animals.db", ios::app, ios::binary);
            menu = false;
            break;
        case EXIT : cout<<"Good Bye!"<<endl;
            system("PAUSE");
            return 0;
        default : cout<<"Incorrect choice! Try again."<<endl;
        }
    }
    updateFile.write((char*) animalDB, sizeof(Animal)*size);
    updateFile.close();
//Открываем файл для чтения, если он существует
    ifstream showFile;
    if (showFile){
        showFile.open("Animals.db", ios::binary);
        showFile.seekg(0, ios::end);
        int fileSize = showFile.tellg();
        int arrSize = fileSize/sizeof(Animal);
        cout<<endl<<endl<<fileSize<<endl<<endl;
        Animal *animalDBtest = new Animal[arrSize];
        showFile.read((char*) animalDBtest, sizeof(Animal)*fileSize);
        ShowAnimals(animalDBtest, arrSize);
        showFile.close();
    } else cout<<"Can't find file \"Animals.db\""<<endl;
    system("PAUSE");
    return 0;
}
 
void ShowAnimals(Animal *animalDB, int size){
    for(int i = 0; i < size; i++){
        cout<<animalDB[i].name<<endl;
        cout<<animalDB[i].code<<endl;
        cout<<animalDB[i].food<<endl;
    }
}
 
void AddAnimals(Animal *animalDB, int size){
    for(int i = 0; i < size; i++){
        cout<<"Pet nr."<<i+1<<": "<<endl;
        cout<<endl<<"Enter pets name: ";
        cin>>animalDB[i].name;
        cout<<endl<<"Enter pets code: ";
        cin>>animalDB[i].code;
        cout<<endl<<"Enter how much pet eat per day: ";
        cin>>animalDB[i].food;
    }
}
 
void Menu(){
    cout<<"If you want to create new database - press: \"1\""<<endl;
    cout<<"If you want to add animals in exciting database - press: \"2\""<<endl;
    cout<<"If you want to exit - press: \"3\""<<endl;
    cout<<"Your choice: ";
}
Добавлено через 39 секунд
проблема где-то с 49 по 59 строки
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.04.2014, 00:11     Загрузка файла в массив
Посмотрите здесь:

Файлы, загрузка с файла C++
C++ [C++] Загрузка файла
C++ Двойная загрузка файла
C++ загрузка bmp файла
Загрузка чисел в массив из файла C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.04.2014, 00:32     Загрузка файла в массив #2
Цитата Сообщение от Blueeyer Посмотреть сообщение
C++
1
2
3
4
...
ifstream showFile;
if (showFile){
...
Это не проверка существования файла. Проверяйте после открытия.

Добавлено через 1 минуту
C++
1
2
3
ifstream showFile("Animals.db", ios::binary);
if (showFile){
...
Blueeyer
12 / 12 / 1
Регистрация: 09.10.2013
Сообщений: 220
08.04.2014, 00:41  [ТС]     Загрузка файла в массив #3
да, случайно ошибся, но почему в массив записывается какой-то мусор?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.04.2014, 00:50     Загрузка файла в массив #4
Цитата Сообщение от Blueeyer Посмотреть сообщение
да, случайно ошибся, но почему в массив записывается какой-то мусор?
То есть, код изменили, ошибки открытия файла нет?

Добавлено через 2 минуты
Цитата Сообщение от Blueeyer Посмотреть сообщение
showFile.read((char*) animalDBtest, sizeof(Animal)*fileSize);
Тут размер неправильный.
Blueeyer
12 / 12 / 1
Регистрация: 09.10.2013
Сообщений: 220
08.04.2014, 00:52  [ТС]     Загрузка файла в массив #5
С этим всё нормально. Вот я записал в файл 2 переменных типа Animal, у меня создался бинарный файл с ними, затем я снова запустил программу, указал, что хочу добавить 0 животных, затем загрузилось всё и вот с 49 по 59 строку оно должно из файла загрузить в новый массив эти 2 переменные. Но загружается мусор, вроде, если вообще загружается

Почему не правильный? sizeof(Animal) умножается на кол-во переменных этого типа, которое находится в файле. Или я что-то не так понимаю?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.04.2014, 00:53     Загрузка файла в массив #6
Нужно или fileSize, или sizeof(Animal)*arrSize.

Добавлено через 1 минуту
Цитата Сообщение от Blueeyer Посмотреть сообщение
С этим всё нормально.
Ничего там не нормально. fileSize - всё количество байт в файле. Вы его ещё умножаете на размер структуры.
Blueeyer
12 / 12 / 1
Регистрация: 09.10.2013
Сообщений: 220
08.04.2014, 00:56  [ТС]     Загрузка файла в массив #7
Ничего не изменилось...
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.04.2014, 00:59     Загрузка файла в массив #8
Цитата Сообщение от Blueeyer Посмотреть сообщение
Ничего не изменилось...
Ничего страшного, ошибки постепенно убираются. Покажите код с исправлениями.
Blueeyer
12 / 12 / 1
Регистрация: 09.10.2013
Сообщений: 220
08.04.2014, 01:00  [ТС]     Загрузка файла в массив #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
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include<iostream>
#include<string>
#include<fstream>
 
using namespace std;
 
struct Animal {
    int code;
    string name;
    double food;
};
 
enum { ADD = 1, NEW, EXIT };
 
void AddAnimals(Animal *animalDB, int size);
void ShowAnimals(Animal *animalDB, int size);
void Menu();
 
int main(){
    int size;
    cout<<"How much animals you want to add? ";
    cin>>size;
    Animal *animalDB = new Animal[size];
    AddAnimals(animalDB, size);
    ShowAnimals(animalDB, size);
// Открываем существующий (или создаем новый) файл, для записи элементов массива в него
    ofstream updateFile;
    bool menu = true;
    while (menu){
        int choice;
        Menu();
        cin>>choice;
        switch(choice){
        case ADD : updateFile.open("Animals.db", ios::out, ios::binary);
            menu = false;
            break;
        case NEW : updateFile.open("Animals.db", ios::app, ios::binary);
            menu = false;
            break;
        case EXIT : cout<<"Good Bye!"<<endl;
            system("PAUSE");
            return 0;
        default : cout<<"Incorrect choice! Try again."<<endl;
        }
    }
    updateFile.write((char*) animalDB, sizeof(Animal)*size);
    updateFile.close();
//Открываем файл для чтения, если он существует
    ifstream showFile;
    showFile.open("Animals.db", ios::binary);
    if (showFile){
        showFile.seekg(0, ios::end);
        int arrSize = showFile.tellg()/sizeof(Animal);
        Animal *animalDBtest = new Animal[arrSize];
        showFile.read((char*) animalDBtest, showFile.tellg());
        ShowAnimals(animalDBtest, arrSize);
        showFile.close();
    } else cout<<"Can't find file \"Animals.db\""<<endl;
    system("PAUSE");
    return 0;
}
 
void ShowAnimals(Animal *animalDB, int size){
    for(int i = 0; i < size; i++){
        cout<<animalDB[i].name<<endl;
        cout<<animalDB[i].code<<endl;
        cout<<animalDB[i].food<<endl;
    }
}
 
void AddAnimals(Animal *animalDB, int size){
    for(int i = 0; i < size; i++){
        cout<<"Pet nr."<<i+1<<": "<<endl;
        cout<<endl<<"Enter pets name: ";
        cin>>animalDB[i].name;
        cout<<endl<<"Enter pets code: ";
        cin>>animalDB[i].code;
        cout<<endl<<"Enter how much pet eat per day: ";
        cin>>animalDB[i].food;
    }
}
 
void Menu(){
    cout<<"If you want to create new database - press: \"1\""<<endl;
    cout<<"If you want to add animals in exciting database - press: \"2\""<<endl;
    cout<<"If you want to exit - press: \"3\""<<endl;
    cout<<"Your choice: ";
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.04.2014, 01:05     Загрузка файла в массив #10
Только сейчас увидел string в структуре. Для структур, с такими полями, бинарные методы записи/чтения не годятся.

Добавлено через 1 минуту
Цитата Сообщение от Blueeyer Посмотреть сообщение
showFile.seekg(0, ios::end);
А обратно, курсор, перед чтением вернуть?
Blueeyer
12 / 12 / 1
Регистрация: 09.10.2013
Сообщений: 220
08.04.2014, 01:05  [ТС]     Загрузка файла в массив #11
тоесть необходим массив чаров или как ещё можно это всё сделать?

Добавлено через 35 секунд
alsav22, упс
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.04.2014, 01:06     Загрузка файла в массив #12
Цитата Сообщение от Blueeyer Посмотреть сообщение
тоесть необходим массив чаров или как ещё можно это всё сделать?
Или массив char, или текстовые методы использовать.
Blueeyer
12 / 12 / 1
Регистрация: 09.10.2013
Сообщений: 220
08.04.2014, 01:08  [ТС]     Загрузка файла в массив #13
а можете помочь исправить это?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.04.2014, 01:08     Загрузка файла в массив #14
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот тут тему почитайте:
Запись и чтение структуры с файла
Blueeyer
12 / 12 / 1
Регистрация: 09.10.2013
Сообщений: 220
08.04.2014, 01:12  [ТС]     Загрузка файла в массив #15
спасибо большое, переставил указатель назад и всё заработало, странно, но даже со string
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.04.2014, 01:13     Загрузка файла в массив #16
Цитата Сообщение от Blueeyer Посмотреть сообщение
а можете помочь исправить это?
Тут особо помогать нечего. Для записи string, int, double - использовать <<, для чтния int, double - >>, для чтания string - getline().

Добавлено через 1 минуту
Цитата Сообщение от Blueeyer Посмотреть сообщение
странно, но даже со string
Нет, это кривой код будет. Когда будет работать (когда адреса в памяти совпадут), когда не будет.
Blueeyer
12 / 12 / 1
Регистрация: 09.10.2013
Сообщений: 220
08.04.2014, 01:15  [ТС]     Загрузка файла в массив #17
тоесть мне string name поменять на char name[30] к примеру?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.04.2014, 01:16     Загрузка файла в массив #18
Дело в том, что в памяти под string (которую вы записываете в файл), обычно, нет самой строки (она где-нибудь в динамической памяти).

Добавлено через 20 секунд
Цитата Сообщение от Blueeyer Посмотреть сообщение
тоесть мне string name поменять на char name[30] к примеру?
Да.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2014, 01:17     Загрузка файла в массив
Еще ссылки по теме:

Загрузка данных из файла с возможностью выбора файла C++
Загрузка файла в массив байтов C++
C++ Загрузка файла на хостинг

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

Или воспользуйтесь поиском по форуму:
Blueeyer
12 / 12 / 1
Регистрация: 09.10.2013
Сообщений: 220
08.04.2014, 01:17  [ТС]     Загрузка файла в массив #19
спасибо, исправил
Yandex
Объявления
08.04.2014, 01:17     Загрузка файла в массив
Ответ Создать тему
Опции темы

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