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

Считывание из файла - C++

Восстановить пароль Регистрация
 
Why so seriouS
 Аватар для Why so seriouS
44 / 44 / 1
Регистрация: 12.03.2013
Сообщений: 167
10.05.2013, 20:24     Считывание из файла #1
Всем привет! Есть вот такая проблема: при считывании данных из файла в объект ниоткуда берутся лишние данные. В чем может быть проблема? Вот пример файла:
1 1 1
2 2 2
А вот что получается когда считываю файл:
1 1 1
2 2 2
2 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
void output(Toys &T)
{
    ifstream in("1.txt");
    char ch;
    while((ch = in.get()) != EOF)
    {
        in.unget();
        in >> T;
        cout << T;
    }
    in.close();
}
Вот полный код:
Toys.h
Кликните здесь для просмотра всего текста
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
#ifndef _TOYS_H_
#define _TOYS_H_
 
#include <iostream>
#include <fstream>
 
using namespace std;
 
class Toys
{
    friend ostream& operator<<(ostream& output,const Toys& T)
    {
        output << T.name << " ";
        output << T.vartist << " ";
        output << T.vikovi_mechi << endl;
 
        return output;
    }
    friend istream& operator>>(istream& intput, Toys& T)
    {
        intput >> T.name;
        intput >> T.vartist;
        intput >> T.vikovi_mechi;
 
        return intput;
    }
    friend ifstream& operator>>(ifstream& intput, Toys& T)
    {
        intput >> T.name;
        intput >> T.vartist;
        intput >> T.vikovi_mechi;
 
        return intput;
    }
    friend ofstream& operator<<(ofstream& output, Toys& T)
    {
        output << T.name << " ";
        output << T.vartist << " ";
        output << T.vikovi_mechi << endl;;
 
        return output;
    }
public:
    bool vart(int tmp)
    {
        if(vartist <= tmp && vikovi_mechi <= 5) return true;
        return false;
    }
    char* getName(){return name;}
    int getVik(){return vikovi_mechi;}
private:
    char name[10];
    int vartist;
    int vikovi_mechi;
};
 
#endif

main.cpp
Кликните здесь для просмотра всего текста
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include <conio.h>
#include <Windows.h>
#include "Toys.h"
 
int menu();
void input(Toys&);
void output(Toys&);
void Show_name(Toys&);
void dozapus(Toys&);
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    system("color 0F");
    int key = 0;
    Toys T;
    while(true)
    {
        key = menu();
        system("cls");
        if(key == 0)
        {
            input(T);
        }
        if(key == 1)
        {
            output(T);
            system("pause>0");
        }
        if(key == 2)
        {
            Show_name(T);
            system("pause>0");
        }
        if(key == 3)
        {
            dozapus(T);
            system("pause>0");
        }
        if(key == 4)
        {
            break;
        }
    }
    return 0;
}
void dozapus(Toys &T)
{
    ofstream out("1.txt",ios::app);
    cin>>T;
    out<<T;
    out.close();
}
void Show_name(Toys &T)
{
    ifstream in("1.txt");
    char ch;
    int tmp = 2;
    while((ch = in.get()) != EOF)
    {
        in.unget();
        in >> T;
        if(T.vart(tmp)) cout << T.getName();
    }
    in.close();
}
void output(Toys &T)
{
    ifstream in("1.txt");
    char ch;
    while((ch = in.get()) != EOF)
    {
        in.unget();
        in >> T;
        cout << T;
    }
    in.close();
}
void input(Toys &T)
{
    ofstream out("1.txt");
    int tmp;
    cin>>tmp;
    while(tmp)
    {
        cin>>T;
        out<<T;
        tmp--;
    }
    out.close();
}
int menu()
{
    int key = 0;
    int code;
    do
    {
        system("cls");
        key = (key+5)%5;
 
        if(key==0) cout<<"=> Ввести дані."<<endl;
        else cout<<"   Ввести дані."<<endl;
 
        if(key==1) cout<<"=> Вивести дані."<<endl;
        else cout<<"   Вивести дані."<<endl;
 
        if(key==2) cout<<"=> Редагувати дані."<<endl;
        else cout<<"   Редагувати дані."<<endl;
 
        if(key==3) cout<<"=> Дозаписати дані."<<endl;
        else cout<<"   Дозаписати дані."<<endl;
 
        if(key==4) cout<<"=> Вихід."<<endl;
        else cout<<"   Вихід."<<endl;
 
        code = getch();
 
        if(code == 80) key++;
        if(code == 72) key--;
    }while(code != 13);
 
    return key;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.05.2013, 20:24     Считывание из файла
Посмотрите здесь:

Считывание из файла C++
C++ считывание из файла
C++ считывание из файла
C++ Считывание из файла
C++ считывание файла
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
10.05.2013, 20:30     Считывание из файла #2
Why so seriouS, проблема в том, что символ конца файла идет не сразу по окончанию текста, а а поток настроен так,что системные символы он просто отбрасывает. Потом получается,что еще не конец файла, но Вы продолжаете читать его, хотя система ничего не кладет в переменную.
Why so seriouS
 Аватар для Why so seriouS
44 / 44 / 1
Регистрация: 12.03.2013
Сообщений: 167
10.05.2013, 20:34  [ТС]     Считывание из файла #3
metaluga145, а не подскажете как можно это исправить?
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
10.05.2013, 20:36     Считывание из файла #4
Why so seriouS, так чтобы сразу все было хорошо, не знаю. А удалить последние два или 3 символа с конца строки всегда можно
Why so seriouS
 Аватар для Why so seriouS
44 / 44 / 1
Регистрация: 12.03.2013
Сообщений: 167
10.05.2013, 20:39  [ТС]     Считывание из файла #5
metaluga145, удалить можно, но я что-то не представляю как это сделать) Может покажете малый пример как это выглядит?)
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
10.05.2013, 20:52     Считывание из файла #6
Цитата Сообщение от Why so seriouS Посмотреть сообщение
key = menu();
* * * * system("cls");
* * * * if(key == 0)
* * * * {
* * * * * * input(T);
* * * * }
* * * * if(key == 1)
* * * * {
* * * * * * output(T);
* * * * * * system("pause>0");
* * * * }
* * * * if(key == 2)
* * * * {
* * * * * * Show_name(T);
* * * * * * system("pause>0");
* * * * }
* * * * if(key == 3)
* * * * {
* * * * * * dozapus(T);
* * * * * * system("pause>0");
* * * * }
* * * * if(key == 4)
* * * * {
* * * * * * break;
* * * * }
* * }
для таких целей лучше использовать оператор switch

Добавлено через 9 минут
а в чем Вы пишите? просто у меня все работает
Why so seriouS
 Аватар для Why so seriouS
44 / 44 / 1
Регистрация: 12.03.2013
Сообщений: 167
10.05.2013, 21:01  [ТС]     Считывание из файла #7
visual studio 2010 express. А в чем вы пишете?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2013, 21:02     Считывание из файла
Еще ссылки по теме:

C++ Считывание из файла
Считывание из файла C++
Считывание с файла C++

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

Или воспользуйтесь поиском по форуму:
Ternsip
 Аватар для Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
10.05.2013, 21:02     Считывание из файла #8
Why so seriouS, делай вот так :
C++
1
2
3
while(in >> T) {
     cout << T;
}
Yandex
Объявления
10.05.2013, 21:02     Считывание из файла
Ответ Создать тему
Опции темы

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