41 / 37 / 8
Регистрация: 24.07.2013
Сообщений: 219
1

C++ файлы ifstream/ofstream

24.07.2013, 16:33. Показов 4718. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброе время суток нужна небольшая помощь с записью/считыванием из файла вообщем при считывание из файла eof() не определяет конца файла и пытается считать следующий элемент понимает что там ничего нету и выдает ошибку это я так понимаю данную ситуацию ! Смотрим пример: пример имеет 100% сходство с ситуацией просто в нем меньше не сущевственного мусора:


lol.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
58
59
60
61
#pragma once
#include <iostream>
using namespace std;
class lol
{
    char*name;
    int id;
    double zone;
public:
    lol(){
        name=NULL;
        id=0;
        zone=0.0;
    }
    lol(char*aname,int aid,double azone){
        name=new char [ strlen(aname)+1 ];
        strcpy_s(name,strlen(aname)+1,aname);
        id=aid;
        zone=azone;
    }
    lol(const lol&av){
        name=new char [strlen(av.get_name())+1];
        strcpy_s(name,strlen(av.get_name())+1,av.get_name());
        id=av.get_id();
        zone=av.get_zone();
    }
    ~lol(){
        cout<<"kill"<<endl;
        delete name;
        cout<<"Kill complit"<<endl;
    }
 
    void set_name(char*aname){
        if(name) delete name;
        name=new char [strlen(aname)+1];
        strcpy_s(name,strlen(aname)+1,aname);
    }
    void set_id(int aid){
        id=aid;
    }
    void set_zone(double azone){
        zone=azone;
    }
    char*get_name()const{
        return name;
    }
    int get_id()const{
        return id;
    }
    double get_zone()const{
        return zone;
    }
    void show(){
        cout<<"name="<<name<<endl;
        cout<<"id="<<id<<endl;
        cout<<"zone="<<zone<<endl;
    }
    friend ostream& operator<<(ostream& os,lol& a);
    friend ifstream& operator>>(ifstream&fs,lol&a);
    friend ofstream& operator<<(ofstream&fs,lol&a);
};


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
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
#include <fstream>
#include "lol.h"
using namespace std;
ostream& operator<<(ostream& os, lol& a)
{
    if(a.name) cout<<"body_type="<<a.name<<endl;
    if(a.id) cout<<"type_of_fuel="<<a.id<<endl;
    if(a.zone) cout<<"displacement="<<a.zone<<endl;
    return os;
}
ifstream& operator>>(ifstream&fs,lol&a)
{
    int sz;
 
 
    fs.read((char*)&sz,sizeof(int));
    fs.read((char*)&a.id,sz*sizeof(char));
 
    fs.read((char*)&sz,sizeof(int));
    fs.read((char*)&a.zone,sz*sizeof(char));
    fs.read((char*)&sz,sizeof(int));
    a.name=new char [sz+1];
    fs.read((char*)a.name,sz*sizeof(char));
    a.name[sz]=0;
    return fs;
}
ofstream& operator<<(ofstream&fs,lol&a)
{
    int sz=sizeof(a.id);
    fs.write((char*)&sz,sizeof(int));
    fs.write((char*)&a.id,sz);
 
    sz=sizeof(a.zone);
    fs.write((char*)&sz,sizeof(int));
    fs.write((char*)&a.zone,sz);
 
    sz=strlen(a.name);
    fs.write((char*)&sz,sizeof(int));
    fs.write(a.name,sz);
 
    return fs;
}
void main()
{
 
    //vector<lol> v1;
    //vector<lol>::iterator iter;
 
    lol m1("alex",1392,0.1);
    lol m2;
    ofstream f("new.bin");
    f<<m1;
    f.close();
    ifstream f1("new.bin");
    while(!f.eof())
    {
        cout<<"eof"<<f.eof()<<endl;
        f1>>m2;
        cout<<m2;
        cout<<"eof"<<f.eof()<<endl;
    }
    f1.close();
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.07.2013, 16:33
Ответы с готовыми решениями:

C++ файлы ifstream/ofstream запись класса
Доброе время суток дамы и господа :) необходимо помочь ибо что-то голова не варит )) класс...

ifstream ofstream
как работают данные файловые операции, объясните пожалуйста куда происходит запись ена жёстком...

Перегрузка ifstream и ofstream?
Есть класс //test.h cass test { private: int i; string st; public:

ifstream/ofstream/fstream
#include &lt;fstream&gt; fstream autosave; autosave.open(&quot;...autosave.txt&quot;); char x; autosave...

20
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.07.2013, 16:37 2
Цитата Сообщение от alex1392 Посмотреть сообщение
вообщем при считывание из файла eof() не определяет конца файла
Это откуда видите?
0
41 / 37 / 8
Регистрация: 24.07.2013
Сообщений: 219
24.07.2013, 16:42  [ТС] 3
в while(!f1.eof) опечатался проблема не в этом ))

Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
Это откуда видите?
при проверке while(!f1.eof()) ходил отладчиком .
Все записаное уже считано однако eof возвращяет 0 а не 1-н и заходит еше раз в цикл в и выдает ошибку
0
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
24.07.2013, 16:46 4
Оформи код нормально, я вообще не могу найти в твоём коде где у тебя там "while(!f1.eof())"
0
41 / 37 / 8
Регистрация: 24.07.2013
Сообщений: 219
24.07.2013, 16:47  [ТС] 5
Цитата Сообщение от Praktolock Посмотреть сообщение
Оформи код нормально, я вообще не могу найти в твоём коде где у тебя там "while(!f1.eof())"
В void main() { ..... } смотреть самый конец стр 60
0
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
24.07.2013, 16:50 6
C++
1
2
3
4
5
6
7
    while(!f.eof())
    {
        cout<<"eof"<<f.eof()<<endl;
        f1>>m2;
        cout<<m2;
        cout<<"eof"<<f.eof()<<endl;
    }
а что этот код должен вообще делать? Каким-то странным способом ты читать из фала пытаешься

Добавлено через 1 минуту
чтобы у тебя сработал eof(), нада чтобы конец фала был достигнут, у тебя же он никогда не достигнется, так как из фала ты не читаешь ничего.
0
41 / 37 / 8
Регистрация: 24.07.2013
Сообщений: 219
24.07.2013, 16:52  [ТС] 7
извеняюсь за мусорку вот мейн отдельно с исправлениемм
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void main()
{
 
    //vector<lol> v1;
    //vector<lol>::iterator iter;
 
    lol m1("alex",1392,0.1);
    lol m2;
    
    ofstream f("new.bin");
    f<<m1;
    f.close();
    ifstream f1("new.bin");
    while(!f1.eof())
    {
        cout<<"f1.eof()="<<f1.eof()<<endl;
        f1>>m2;
        cout<<m2;
        cout<<"f1.eof()="<<f1.eof()<<endl;
    }
    f1.close();
}
Добавлено через 1 минуту
Цитата Сообщение от Praktolock Посмотреть сообщение
C++
1
2
3
4
5
6
7
    while(!f.eof())
    {
        cout<<"eof"<<f.eof()<<endl;
        f1>>m2;
        cout<<m2;
        cout<<"eof"<<f.eof()<<endl;
    }
а что этот код должен вообще делать? Каким-то странным способом ты читать из фала пытаешься

Добавлено через 1 минуту
чтобы у тебя сработал eof(), нада чтобы конец фала был достигнут, у тебя же он никогда не достигнется, так как из фала ты не читаешь ничего.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ifstream& operator>>(ifstream&fs,lol&a)
{
    int sz;
 
 
    fs.read((char*)&sz,sizeof(int));
    fs.read((char*)&a.id,sz*sizeof(char));
 
    fs.read((char*)&sz,sizeof(int));
    fs.read((char*)&a.zone,sz*sizeof(char));
    fs.read((char*)&sz,sizeof(int));
    a.name=new char [sz+1];
    fs.read((char*)a.name,sz*sizeof(char));
    a.name[sz]=0;
    return fs;
}
0
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
24.07.2013, 16:54 8
Да, затупил немнога, не заметил
C++
1
2
f1>>m2;
cout<<m2;
а вот такие строки
C++
1
cout<<"eof"<<f.eof()<<endl;
явно лишние
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.07.2013, 16:57 9
Код исключение выбрасывает: что-то с выделенной памятью.
0
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
24.07.2013, 17:00 10
void
0
41 / 37 / 8
Регистрация: 24.07.2013
Сообщений: 219
24.07.2013, 17:10  [ТС] 11
вообщем испробовал много разного но пока ничего не помогло
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.07.2013, 17:10 12
С выделением памяти не разбирался, но если так сделать, то будет нормально читать из файла:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ifstream& operator>>(ifstream&fs,lol&a)
 {
     int sz;
 
     fs.read((char*)&sz,sizeof(int));
     if (fs.eof()) return fs;
     fs.read((char*)&a.id, sz*sizeof(char));
 
     fs.read((char*)&sz, sizeof(int));
     fs.read((char*)&a.zone, sz*sizeof(char));
     fs.read((char*)&sz, sizeof(int));
     a.name = new char [sz+1];
     fs.read((char*)a.name, sz*sizeof(char));
     a.name[sz]=0;
     return fs;
 }
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
int main()
{
 
    //vector<lol> v1;
    //vector<lol>::iterator iter;
 
    lol m1("alex",1392,0.1);
    lol m2;
    
    ofstream f("new.bin");
    f<<m1;
    f.close();
    ifstream f1("new.bin");
    while(1)
    {
        //cout<<"f1.eof()="<<f1.eof()<<endl;
        f1>>m2;
        if (f1.eof()) break;
        cout<<m2;
        //cout<<"f1.eof()="<<f1.eof()<<endl;
    }
    f1.close();
 
    return 0;
}
1
41 / 37 / 8
Регистрация: 24.07.2013
Сообщений: 219
24.07.2013, 17:17  [ТС] 13
спс за помощь )) проблема решина хоть и не коректно
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.07.2013, 17:18 14
Цитата Сообщение от alex1392 Посмотреть сообщение
спс за помощь )) проблема решина хоть и не коректно
В чём некорректность?
0
41 / 37 / 8
Регистрация: 24.07.2013
Сообщений: 219
24.07.2013, 17:26  [ТС] 15
Цитата Сообщение от alsav22 Посмотреть сообщение
В чём некорректность?
в том что мною была допущена гдето ошибка изза которой и появился этот глюк и такое ее решение впринципе подходит но гораздо лудши было бы найти где я ошибся ))) но с этим я уже справлюсь главное что на данном этапе работает ) еше раз благодарю за помощь )
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.07.2013, 17:32 16
Код у вас странный (или это для примера?). Записываете в файл одну структуру, а читаете оттуда, зачем-то, в цикле.

Добавлено через 1 минуту
Цикл нужен, если в массив читать.

Добавлено через 2 минуты
Цитата Сообщение от alex1392 Посмотреть сообщение
такое ее решение впринципе подходит
Тут главное то, что проверку на eof() всегда нужно делать в прегруженном операторе (там более, если вы в нём память выделяете), иначе будут проблемы.

Добавлено через 1 минуту
Когда читаете структуры из файл, можно и без проверки на eof() обойтись. Сначала считаете количество структур в файле, потом читаете это количество в for().
0
41 / 37 / 8
Регистрация: 24.07.2013
Сообщений: 219
24.07.2013, 17:35  [ТС] 17
Тут главное то, что проверку на eof() всегда нужно делать в прегруженном операторе (там более, если вы в нём память выделяете), иначе будут проблемы.

оО если честно я изучаю С++ и не знал этого факта спс за подсказку . А по поводу цикла )) это только пример в реальной задачи в них есть необходимость )
и все это записывается из файла в вектор
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.07.2013, 18:08 18
Если в вектор... Зачем вам поле char*name в классе. Лишняя возня с выделением\освобождением памяти. Не проще ли string?
0
41 / 37 / 8
Регистрация: 24.07.2013
Сообщений: 219
24.07.2013, 18:49  [ТС] 19
Цитата Сообщение от alsav22 Посмотреть сообщение
Если в вектор... Зачем вам поле char*name в классе. Лишняя возня с выделением\освобождением памяти. Не проще ли string?
Если честно со string еше не работал ) string относится к stl я верно понимаю? сейчас буду со string разбиратся ) ужас как я прогнал это ведь прийдется все заменить на string теперь ))
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.07.2013, 18:55 20
Цитата Сообщение от alex1392 Посмотреть сообщение
string относится к stl я верно понимаю?
Нет, просто шаблонный класс. Вот вектор - это STL.
0
24.07.2013, 18:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.07.2013, 18:55
Помогаю со студенческими работами здесь

Работаем с потоками на C++ ofstream и ifstream
Доброго времени суток! Подскажите пожалуйста, как при использовании ofstream и ifstream...

Работа с потоками ofstream/ifstream
Добрый вечер! Помогите, пожалуйста, с задачей! Дан класс: class data { char str; //дата...

ifstream, ofstream и объекты класса
Доброго времени суток, помогите пожалуйста разобраться. Есть некий класс: class Tr { public:...

class/string/ifstream/ofstream
Доброе время суток всем!! Люди я уперся в стену и буду признателен за помощь date.h #pragma...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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