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

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

Войти
Регистрация
Восстановить пароль
 
 
Blueeyer
12 / 12 / 1
Регистрация: 09.10.2013
Сообщений: 222
#1

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

08.04.2014, 00:11. Просмотров 457. Ответов 18
Метки нет (Все метки)

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

Загрузка файла в массив байтов - C++
не подскажите как можно загрузить файл и сохранить его не в файл на пк, а в переменную байтов? т.е сохранить в массив байтов

Загрузка чисел в массив из файла - C++
Есть файл с числами (19 29 0), разделенными пробелами (разного количества). Считывается строка из файла, и в цикле считываются числа из...

Файл: Загрузка данных из файла: первый столбец записывался в 1й массив, второй столбец - во 2й массив, а 3й столбец - в 3й массив. - C++
Есть текстовый файл, в нем 3 столбца чисел (число строк заранее неизвестно). Напишите пожалуйста код, чтобы первый столбец записывался в...

Загрузка данных из файла в массив целиком, а не по элементам - C++
Доброго времени суток. Такой вопрос: как загрузить данные из файла в массив целиком, за один раз? количество элементов в файле и размер...

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

[C++] Загрузка файла - C++
#include &quot;stdafx.h&quot; #include &lt;windows.h&gt; #include &lt;urlmon.h&gt; #pragma comment(lib, &quot;urlmon.lib&quot;) int main() { HRESULT hr...

18
alsav22
5421 / 4816 / 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){
...
1
Blueeyer
12 / 12 / 1
Регистрация: 09.10.2013
Сообщений: 222
08.04.2014, 00:41  [ТС] #3
да, случайно ошибся, но почему в массив записывается какой-то мусор?
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.04.2014, 00:50 #4
Цитата Сообщение от Blueeyer Посмотреть сообщение
да, случайно ошибся, но почему в массив записывается какой-то мусор?
То есть, код изменили, ошибки открытия файла нет?

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

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

Добавлено через 1 минуту
Цитата Сообщение от Blueeyer Посмотреть сообщение
С этим всё нормально.
Ничего там не нормально. fileSize - всё количество байт в файле. Вы его ещё умножаете на размер структуры.
0
Blueeyer
12 / 12 / 1
Регистрация: 09.10.2013
Сообщений: 222
08.04.2014, 00:56  [ТС] #7
Ничего не изменилось...
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.04.2014, 00:59 #8
Цитата Сообщение от Blueeyer Посмотреть сообщение
Ничего не изменилось...
Ничего страшного, ошибки постепенно убираются. Покажите код с исправлениями.
1
Blueeyer
12 / 12 / 1
Регистрация: 09.10.2013
Сообщений: 222
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: ";
}
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.04.2014, 01:05 #10
Только сейчас увидел string в структуре. Для структур, с такими полями, бинарные методы записи/чтения не годятся.

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

Добавлено через 35 секунд
alsav22, упс
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.04.2014, 01:06 #12
Цитата Сообщение от Blueeyer Посмотреть сообщение
тоесть необходим массив чаров или как ещё можно это всё сделать?
Или массив char, или текстовые методы использовать.
0
Blueeyer
12 / 12 / 1
Регистрация: 09.10.2013
Сообщений: 222
08.04.2014, 01:08  [ТС] #13
а можете помочь исправить это?
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.04.2014, 01:08 #14
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот тут тему почитайте:
Запись и чтение структуры с файла
1
Blueeyer
12 / 12 / 1
Регистрация: 09.10.2013
Сообщений: 222
08.04.2014, 01:12  [ТС] #15
спасибо большое, переставил указатель назад и всё заработало, странно, но даже со string
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2014, 01:12
Привет! Вот еще темы с ответами:

Загрузка файла на хостинг - C++
Доброго времен суток, уважаемые посетители cyberforum! Хотелось бы узнать, каким образом можно залить файл на хостинг? (http://rghost.ru/...

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

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

Загрузка файла из интернета - C++
Товарищи, имею следующих вопрос- необходимо мне написать программу на C++, которая скачивает из интернета xml и сохраняет на диске. Как...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
08.04.2014, 01:12
Ответ Создать тему
Опции темы

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