Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
12 / 12 / 7
Регистрация: 09.10.2013
Сообщений: 222
1

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте, помогите, при загрузке из файла в массив - выбивается какой-то мусор... в чем дело?
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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.04.2014, 00:11
Ответы с готовыми решениями:

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

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

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

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

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

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

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

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

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

Добавлено через 35 секунд
alsav22, упс
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
08.04.2014, 01:06 12
Цитата Сообщение от Blueeyer Посмотреть сообщение
тоесть необходим массив чаров или как ещё можно это всё сделать?
Или массив char, или текстовые методы использовать.
0
12 / 12 / 7
Регистрация: 09.10.2013
Сообщений: 222
08.04.2014, 01:08  [ТС] 13
а можете помочь исправить это?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
08.04.2014, 01:08 14
Лучший ответ Сообщение было отмечено Blueeyer как решение

Решение

Вот тут тему почитайте:
Запись и чтение структуры с файла
1
12 / 12 / 7
Регистрация: 09.10.2013
Сообщений: 222
08.04.2014, 01:12  [ТС] 15
спасибо большое, переставил указатель назад и всё заработало, странно, но даже со string
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
08.04.2014, 01:13 16
Цитата Сообщение от Blueeyer Посмотреть сообщение
а можете помочь исправить это?
Тут особо помогать нечего. Для записи string, int, double - использовать <<, для чтния int, double - >>, для чтания string - getline().

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

Добавлено через 20 секунд
Цитата Сообщение от Blueeyer Посмотреть сообщение
тоесть мне string name поменять на char name[30] к примеру?
Да.
1
12 / 12 / 7
Регистрация: 09.10.2013
Сообщений: 222
08.04.2014, 01:17  [ТС] 19
спасибо, исправил
0
08.04.2014, 01:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.04.2014, 01:17
Помогаю со студенческими работами здесь

Загрузка строк из файла в массив
Помогите загрузить строки из фала в массив. Есть текстовый файл. В нём с каждой новой строки...

Загрузка .txt файла в массив С++
Доброго время суток! Помогите кто знает Суть в чем я делаю загрузку так - array&lt;String^&gt;^ strIn =...

Загрузка текстового файла в символьный массив
Здравствуйте, возникла проблема с передачей файла в символьный массив Сам изучаю C# только 3 дня,...

загрузка (download) файла в массив байт
Привет всем! Подскажите, пожалуйста, каким образом по прямому HTTP-запросу загрузить файл из...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru