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

Почему ввод переменной из файла не работает?

06.09.2016, 07:03. Показов 595. Ответов 5
Метки нет (Все метки)

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
#include <conio.h>
#include <iostream>
#include <fstream>
#include <cstring>
 
using namespace std;
 
//Открытие файла
void OpenFile()
{
    ifstream fin;
    char file[50];
    
    system("cls");
    cout << "\nВведите имя файла: ";
    cin >> file;
    fin.open(file);
    if (!fin.is_open())
    {
        cout << "Файла " << file << " не существует";
        _getch();
    }
    else
    {
        cout << "Файл " << file << " открыт\n\n";
        _getch();
    }
}
 
//Считываение данных из файла
void GetFromFile(istream &is)
{
    int year;
    system("cls");
        
    is >> year;
    cout << """ << year << ""\n";
 
    cout << "Данные успешно считаны\n\n";
    cout << "Нажмите любую клавишу, чтобы вернуться в меню";
    _getch();
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
    ifstream fin;
    ofstream fout;
        
    OpenFile();
    GetFromFile(fin);
            
    return 0;
}
Загвоздка в следующем:
Ввод переменной из файла не работает
У человека, на код которого я ориентировался, ввод происходит, у меня - нет
Дошел до того, что скопировал практически весь его код, но все по-прежнему
Велика вероятность того, что я просто не вижу ошибки, но уже почти сутки перебираю варианты и не могу решить этот вопрос.
Буду бесконечно признателен за подсказку
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.09.2016, 07:03
Ответы с готовыми решениями:

Почему не работает ввод данных из файла?
Есть код сортировки бинарным деревом. Собственно не работает только ввод элементов из файла (case 2...

почему не работает ввод из файла? что нужно исправть??
почему не работает ввод из файла? что нужно исправть?? помогите! Program Matrix; const ...

Что работает быстрее, ввод с консоли или ввод с файла?
вводятся множество списков программа удаляет первое число списка и удаляет все числа в этом списке...

Ввод файла и присвоение значения переменной
Добрый вечер! Хотелось бы для себя прояснить нюансы, связанные с вводом файла и присвоением его...

5
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
06.09.2016, 11:47 2
fin, который ты создаёшь в main(), а потом передаёшь по ссылке в GetFromFile(), не имеет никакого отношения к fin, который ты создаёшь в OpenFile(), и который умирает при окончании работы этой функции.
1
0 / 0 / 0
Регистрация: 06.09.2016
Сообщений: 4
07.09.2016, 18:18  [ТС] 3
Спасибо за доступное пояснение
Теперь вижу причину

Добавлено через 21 час 5 минут
Ввод-вывод теперь работает, но теперь не могу записать данные из файла в структуру.
Переменные типа int и bool записываются корректно, переменные типа char - нет.
Изначально я решил, что проблема с памятью, но освобождение оной не решило проблемы

♦ I вариант (с освобождением динамической памяти - delete[]ma; delete[]co; ):
При последующем выводе структуры значения всех s[i].mark остается одинаковым (выводит символ "u")

♦ II вариант (без освобождения динамической памяти):
При последующем выводе структуры содержание всех s[i].mark остается одинаковым (выводит одну марку автомобиля).

Подскажите, пожалуйста, где я неправ?

P.s: В цикле записи данных из файла в структуру после присвоения s[i].mark = ma;[/COLOR] добавлял вывод на экран значения s[i].mark. Присвоение проходит успешно - каждый раз присваивается новое значение.
Однако, если поставить вывод s[i].mark после тела цикла, то значения уже будут одинаковые (s[0].mark = s[1].mark = s[2].mark = ... )

Структура

C++
1
2
3
4
5
6
7
8
9
10
11
struct Auto
{
    char *mark;
    int year;
    char *country;
    bool used;
    int owners;
    bool accidents; 
    bool wheel;
    int cost;
};


Выделение и удаление динамической памяти для структуры в main()

C++
1
2
Auto *car = new Auto[N];
delete[] car;


Считывание данных из файла

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
void GetFromFile(istream &is, Auto s[], int b)
{
    char *ma = new char[15];
    char *co = new char[15];
    int year, owners, cost;
    bool used, accidents, wheel;
 
    system("cls");
    for (int i = 0; i < b;i++)
    {
        for (int j = 0;j < 15;j++)
        {
            ma[i] = '\n';
            co[i] = '\n';
        }
        
        is >> ma >> year >> co >> used >> owners >> accidents >> wheel >> cost;
        
        s[i].mark = ma; 
        s[i].year = year;
        s[i].country = co;
        s[i].used = used;
        s[i].owners = owners;
        s[i].accidents = accidents;
        s[i].wheel = wheel;
        s[i].cost = cost;
    }
    cout << "Данные успешно считаны\n\n";
    cout << "Нажмите любую клавишу, чтобы вернуться в меню";  
    delete[]ma;
    delete[]co;
    _getch();
}


Вывод структуры

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void Print(const Auto s[], int b)
{
    system("cls");
    for (int i = 0; i < b; i++)
    {
        cout << "Автомобиль №" << i + 1 << ":\n\n";
        cout << "Марка: " << s[i].mark << endl;
        cout << "Год выпуска: " << s[i].year << endl;
        cout << "Страна производитель: " << s[i].country << endl;
        if (s[i].used == true) cout << "Автомобиль новый\n";
        if (s[i].used == false) cout << "Автомобиль б/у\n";
        cout << "Количество собственников: " << s[i].owners << endl;
        if (s[i].accidents == true) cout << "Автомобиль попадал в аварии\n";
        if (s[i].accidents == false) cout << "Автомобиль не попадал в аварии\n";
        if (s[i].wheel == true) cout << "Руль справа\n";
        if (s[i].wheel == false) cout << "Руль слева\n";
        cout << "Стоимость: " << s[i].cost << " руб.\n\n";
    }
    _getch();
}
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
07.09.2016, 22:29 4
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
struct Auto
{
    char *mark;
    int  year;
    char *country;
    bool used;
    int  owners;
    bool accidents; 
    bool wheel;
    int  cost;
};
 
void GetFromFile(istream &is, Auto s[], int b)
{
    system("cls");
    for (int i = 0; i < b;i++)
    {
        is >> s[i].mark >> s[i].year >> s[i].country >> 
        s[i].used >> s[i].owners >> s[i].accidents >> s[i].wheel >> s[i].cost;
 
     }
    cout << "Данные успешно считаны\n\n";
    cout << "Нажмите любую клавишу, чтобы вернуться в меню";  
    
    _getch();
}
 
void Print(const Auto s[], int b)
{
    system("cls");
    for (int i = 0; i < b; i++)
    {
        cout << "Автомобиль №" << i + 1 << ":\n\n";
        cout << "Марка: " << s[i].mark << endl;
        cout << "Год выпуска: " << s[i].year << endl;
        cout << "Страна производитель: " << s[i].country << endl;
        if (s[i].used == true) cout << "Автомобиль новый\n";
        if (s[i].used == false) cout << "Автомобиль б/у\n";
        cout << "Количество собственников: " << s[i].owners << endl;
        if (s[i].accidents == true) cout << "Автомобиль попадал в аварии\n";
        if (s[i].accidents == false) cout << "Автомобиль не попадал в аварии\n";
        if (s[i].wheel == true) cout << "Руль справа\n";
        if (s[i].wheel == false) cout << "Руль слева\n";
        cout << "Стоимость: " << s[i].cost << " руб.\n\n";
    }
    _getch();
}
 
 
 
int main()
{
    setlocale(0, "");
    
    const int N = 2;
    
    Auto *car = new Auto[N];
    for (int i = 0; i < N; ++i)
    {
        car[i].mark = new char[15];
        car[i].country = new char[15];
    }
 
    ifstream fin("file.txt");
    if (fin)
    {
        GetFromFile(fin, car, N);
        Print(car, N);
    }
    else
        cout << "Error!" << endl;
 
    for (int i = 0; i < N; ++i)
    {
        delete [] car[i].mark;
        delete [] car[i].country;
    }
    delete[] car;
    
    system("pause");
    return 0;
}
1
0 / 0 / 0
Регистрация: 06.09.2016
Сообщений: 4
08.09.2016, 05:16  [ТС] 5
Еще раз огромное спасибо!!!
Все работает
0
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
08.09.2016, 08:01 6
Цитата Сообщение от Oleg_b4 Посмотреть сообщение
Не могу найти подходящую тему для обсуждения, а в правильности создания новой сомневаюсь. Поэтому напишу здесь.
Поэтому напишу здесь прочитаю правила форума.
0
08.09.2016, 08:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.09.2016, 08:01
Помогаю со студенческими работами здесь

Почему не работает сет переменной с кейсами?
declare @PlaceDeliveryId int = (select p.PlaceDeliveryId from Point p where p.PointId = @PointId)...

Структуры. Файловый ввод вывод. Почему не работает программа ?
Задача: В зараннее написанном текстовом документе имеются фамилии учеников и их оценки. Нужно...

Ввод из файла не работает
Здравствуйте, помогите пожалуйста решить проблему. Программа должна ввести данные из файла в массив...

Ввод и вывод из файла не работает — выдает ошибки
#include &lt;iostream&gt; #include&lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;string.h&gt; #include &quot;stdafx.h&quot;...


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

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