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

Работа с fstream - C++

Восстановить пароль Регистрация
 
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
23.08.2013, 13:32     Работа с fstream #1
Здорова!

Создал класс для записи и чтения файла через операцию [] , но почему то он работает не так как нужно.
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
#include <iostream>
using std::cout;
using std::endl;
#include <fstream>
using std::fstream;
#include <cstdlib>
using std::exit;
#include <streambuf>
using std::streambuf;
 
class pot
{
    fstream* pt;
public:
    struct exept{};
 
    pot(char* name)
    {
        pt=new fstream;
        pt->open(name,fstream::out|fstream::in|fstream::ate|fstream::ate|fstream::binary);
    }
 
    //присваивание означает запись в файл
    //для символа
    pot& operator=(char c){*pt <<c;return *this;}
    //для int 
    pot& operator=(int n)
    {
        *pt <<n;
        return *this;
    }
 
    pot& operator[](int i)
    {
        pt->seekg(0,pt->end);
        if(i>=pt->tellg())
        {
            pt->seekg(0,pt->beg);
            return *this;
        }
        else
        {
            pt->seekg(i);
            return *this;
        }
    }
 
    //оператор преобразования.
    operator char(){return pt->get();}
    operator int(){int n; *pt >>n; return n;}
};
 
int main()
{
    pot f("myfile.txt");
    f[0]='a';
    f[1]='b';
    f[2]='c';
    f[3]='d';
    f[0]='7';
    f[2]=3333;
    char c=f[0]; cout <<c;
    c=f[1];cout <<c;
    c=f[2];cout <<c;
    c=f[3];cout <<c<<endl;
    //вывод operator int()
    cout <<f[0]<<f[1]<<f[2]<<f[3]<<endl;
 
    //символы почемуто заново не записываются отут
    //и числа не добавляются
    f[0]='8';//не записывается
    f[4]=1111111;//не запишется почему?
 
    return 0;
}
От почему то сначала символы нормально добавляются в файл, а после того как я сделаю вывод после операции преобразования, почему то символы перестают добавляться в файл? В примере символ '8' и число 1111111 не добавляется в файл почему? Я проверял указатель на fstream остается один и тот же (выводил адреса). Что же происходит? Что с fstream произошло? Почему невозможно в него записать символ.

Еще от про открытие файла не понятно от если я в open передаю fstream::out|fstream::in|fstream::ate|fstream::ate|fstream::binary у меня почему то если файла нету то он не создается новый, что бы создался новый нужно ate заменить на app либо добавить app, но c app я немогу курсор перемещать по файлу. Что в режиме ate нельзя получается создать файл если его нету, можно только работать с уже готовыми файлами? То есть нужно что то как то так сделать: "Если нельзя открыть файл, то мы открываем с помощью app, то есть создаем пустой файл закрываем поток и заново открываем с ate что бы можно было курсор перемещать. ???

Еще про бинарный режим не сильно понятно как курсор перемещается по файлу используя символы или так сказать блоки памяти int, char, double и т.д. Как бы если записано int 333 то в файле это будет если в бинарном режиме в ячейке допустим [0], ладно я вроде экспериментировал и если файл мы открываем то в бинарном режиме курсор перемещается посимвольно. От если у нас в число записано 333 и мы seekg(1); делаем и считаем в переменную int число то считается 33. В общем можно сделать вывод что бинарный режим применяется только для чтения и записи чисел, можно сказать числовых типов, то есть в бинарном режиме мы можем число 333 записать в три символа и считать также в три символ. Я для типов double не пробовал, но думаю там тоже так будет работать. В общем бинарный режим применяется только для этого? В любом случае в файле данные хранятся в виде символов, только читаются и записываются по разному, правильно ж?????

И еще отета от строчка что она означает? fstream::out|fstream::in|fstream::ate|fstream::ate|fstream::binary
От что сдесь передается в функцию? Число наверно да? Если палочка это логическая операция над числами то должно быть число, но тогда наверно если мы поменяем местами части строки это не одно и тоже будет fstream::out|fstream::in|fstream::ate|fstream::ate|fstream::binary это не fstream::binary|fstream::out|fstream::in|fstream::ate|fstream::ate ???????

Меня от само больше беспокоит это пример с кодом, не понятно почему я уже не могу записывать в файл после нескольких записей и вывода? Я уже экспериментировал по разному в самой функции operator=(int) пытался уже и символ и файл записать через дескриптор но ничего не получается, хотя должно записываться должно, но нет на деле нифига. ??????
Мб кто что знает?????

Добавлено через 22 минуты
От то что мой класс в себе скрывает, все работает нормально, но через мой класс нифига не работает.
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
fstream f;
    f.open("myfile.txt",fstream::in|fstream::out|fstream::ate|fstream::binary);
    f.seekg(0);
    f <<'a';
    f.seekg(1);
    f <<'b';
    f.seekg(2);
    f <<'c';
    f.seekg(3);
    f <<'d';
 
    //вывод
    char c;
    f.seekg(0);
    f >>c; cout <<c;
    f.seekg(1);
    f >>c; cout <<c;
    f.seekg(2);
    f >>c; cout <<c;
    f.seekg(3);
    f >>c; cout <<c<<endl;
 
    //снова пытаемся записать
    f.seekg(0);
    f <<'8';
    f.seekg(4);
    f <<1111111;
Добавлено через 30 минут
Я нашол вчем ошибка cout <<f[0]<<f[1]<<f[2]<<f[3]<<endl; Почему то оператор считывания как то работает неправильно у меня в f[0] находится число все правильно, но в f[1], f[2], f[3] находятся символы потому что я записываю символы в число поэтому поток как то портится. Если мы эту строчку заменим на cout f[0], то все нормально работает и потом записывается после. Ппц какой то. Я вообще хочу что бы все на автомате определялось если символ то вызывался operator char () если число то operator int () ппц просто оно для все вызывается operator int(). ???

Добавлено через 2 минуты
Придется наверно явно присваивать через переменную либо int либо char, потому что на автомате оно вызывает всегда operator int(), закумарила меня уже эта неразбериха.

Добавлено через 22 минуты
Вообще нипонятно что выводится кокието большие числа с минусом хз. что это.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2013, 13:32     Работа с fstream
Посмотрите здесь:

Работа с fstream C++
C++ Работа с классом fstream.h
C++ fstream работа с файлами
C++ Работа с fstream
Работа с Fstream C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.08.2013, 13:37     Работа с fstream #2
Цитата Сообщение от ninja2 Посмотреть сообщение
Что в режиме ate нельзя получается создать файл если его нету, можно только работать с уже готовыми файлами?
Зачем вам этот ate? Трудно самому курсор в конец файла передвинуть?
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
23.08.2013, 13:40  [ТС]     Работа с fstream #3
Почему отак выводится нормально
C++
1
int n=f[0];cout <<"n= "<<n<<endl;
а если я выведу просто cout <<f[0] то у меня выводится громадное числов с минусом? Вообще должно вывестись то же самое как бы число вызывается operator <<(operator[](0).operator char()) отакая от фигня должна вызватся для cout и вывести тоже что и n=f[0] число. Но на практике для cout почемуто фигня выводится?

Добавлено через 41 секунду
alsav22, мне нужно по файлу перемещаться как по массиву.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.08.2013, 13:49     Работа с fstream #4
Цитата Сообщение от ninja2 Посмотреть сообщение
alsav22, мне нужно по файлу перемещаться как по массиву.
И чем открытие без ate мешает это делать?
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
23.08.2013, 13:55  [ТС]     Работа с fstream #5
alsav22, Без ate нельзя курсор по потоку перемещать только данные будут добавлены в конец потока.

Молодой человек! Мне вообще то нужны ответы на мои вопросы, а не самому вас учить.

Добавлено через 2 минуты
В общем оказывается при считывании не числа в cout те как бы у меня fail() потока принимает значение 1 и поэтому видимо нельзя дальше работать с потоком. Ппц все так запутано.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.08.2013, 14:07     Работа с fstream #6
Цитата Сообщение от ninja2 Посмотреть сообщение
alsav22, Без ate нельзя курсор по потоку перемещать только данные будут добавлены в конец потока.
Если файл открыт в режиме ios::in | ios::out, нельзя курсор перемещать?
Цитата Сообщение от ninja2 Посмотреть сообщение
Мне вообще то нужны ответы на мои вопросы,
А это разве не вопрос?
Цитата Сообщение от ninja2 Посмотреть сообщение
Что в режиме ate нельзя получается создать файл если его нету, можно только работать с уже готовыми файлами?
Что вы вцепились в это режим ate, как будто бы без него нельзя обойтись...

Добавлено через 1 минуту

Не по теме:

И откуда вы знаете, что я - "молодой человек"?

ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
23.08.2013, 14:12  [ТС]     Работа с fstream #7
Цитата Сообщение от alsav22 Посмотреть сообщение
Если файл открыт в режиме ios::in | ios::out, нельзя курсор перемещать?
Не знаю не пробовал, если app то тогда нельзя. Мне нужно что бы курсор можно было перемещать, и что бы если файла нету то создался новый, только отета строчка позволяла новый файл создать ios::in|ios::out|ios::app, если вместо app ate то новый файл не создавался, без ate не пробовал.
Цитата Сообщение от alsav22 Посмотреть сообщение
Что вы вцепились в это режим ate, как будто бы без него нельзя обойтись...
Не знаю я думал что токо в этом режиме можно курсором двигать, без него думал нельзя.

Добавлено через 42 секунды
alsav22, alsav22 , возможно 22 года.

Добавлено через 59 секунд
alsav22, Ладно я прикалолся просто.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.08.2013, 14:19     Работа с fstream #8
Цитата Сообщение от ninja2 Посмотреть сообщение
alsav22, alsav22 , возможно 22 года.
Логика железная... Так я на форуме с 11, а сейчас 13, и всё 22? Шучу...

Добавлено через 2 минуты
Цитата Сообщение от ninja2 Посмотреть сообщение
Не знаю я думал что токо в этом режиме можно курсором двигать, без него думал нельзя.
Двигать можно во всех режимах. При этом запись не всегда в любом месте можно делать.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
23.08.2013, 14:20  [ТС]     Работа с fstream #9
И еще нужно понять чем бинарный режим отличается от режима без него.
От я в бинарном режиме открыл файл и читаю символ и файла в переменную int и у меня ничего не читается
n так нулем и остается понятно почему у меня большие числа были это просто мусор из cout.

C++
1
2
3
4
5
6
7
fstream* f=new fstream;
    f->open("myfile.txt",fstream::in|fstream::out|fstream::ate|fstream::binary);
    f->seekg(2);
    int n(0);
    *f >>n;
    cout <<"n= "<<n<<endl;
    cout <<" f->fail()= "<<f->fail()<<endl;
Да числа видим если в файле не числовой символ то его нельзя считать в int при бинарном режиме. ппц.

Но в то же время числовой символ можно считать спокойно в переменную типа char как не странно.
C++
1
2
3
4
5
6
7
8
fstream* f=new fstream;
    f->open("myfile.txt",fstream::in|fstream::out|fstream::ate|fstream::binary);
    f->seekg(1);
    int n(0);
    char c;
    *f >>c;
    cout <<"c= "<<c<<endl;
    cout <<" f->fail()= "<<f->fail()<<endl;
Ну от что все читается в char любой символ, от токо в int читается исключительно числовые символы из потока. ппц просто. А если не в бинарном режиме то наверно в int вообще ничего не считается?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.08.2013, 14:23     Работа с fstream #10
Каждый раз нужно, чтобы новый создавался? Или: если нет создаётся, если есть, то не стирается, и запись в любое место?
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
23.08.2013, 14:38  [ТС]     Работа с fstream #11
От я сделал не в бинарном режиме и что происходит? То же самое что и в бинарном, так же само числа считываются два разряда и один разряд смотря где стоит указатель и если символ не числовой в файле то он тоже не считывается
C++
1
2
3
4
5
6
7
8
fstream* f=new fstream;
    f->open("myfile.txt",fstream::in|fstream::out|fstream::ate);
    f->seekg(2);
    int n(0);
    char c;
    *f >>n;
    cout <<"n= "<<n<<endl;
    cout <<" f->fail()= "<<f->fail()<<endl;
И чем же тогда отличается бинарный режим? Ну да возможно только записью в файл, как видно считывается что в бинарном что без одинаково.

Добавлено через 6 минут
И записывает числа полность все разряды что в бинарном режиме что не в бинарном
C++
1
2
3
4
5
6
7
8
fstream* f=new fstream;
    f->open("myfile.txt",fstream::in|fstream::out|fstream::ate);
    f->seekg(0);
    int n(444);
    char c;
    *f <<n;//полностью число записывается
    cout <<"n= "<<n<<endl;
    cout <<" f->fail()= "<<f->fail()<<endl;
Так в чом же разница между бинарным режимом и без, если числа все рамно полностью записываются как есть.????
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.08.2013, 15:48     Работа с fstream #12
Цитата Сообщение от ninja2 Посмотреть сообщение
Так в чом же разница между бинарным режимом и без, если числа все рамно полностью записываются как есть.????
Открываете в бинарном, но читаете текстовыми методами. Там разница будет только, если правильно помню, в перемещении курсора через символ '\n' (один символ или два: '\r\n'). Бинарный, в основном, нужен для того, чтобы можно было использовать бинарные методы (read(), write()), если запись в файле была сделана в бинарном режиме.

Добавлено через 57 минут
Открыть файл для чтения и записи, если нет, то создать и открыть для чтения и записи. Курсор в начале файла. Можно пердвигать курсор, и читать из произвольного места, записывать в произвольное место. Чтобы перейти от чтения к записи, нужно указать, через seekp, куда записывать. После же записи, к чтению, можно сразу переходить (но не забыть очистить буфер (flush()), чтобы запись попала в файл).
C++
1
2
3
4
5
6
7
8
fstream f;
f.open("file.txt");
if (!f.is_open())
{
    f.open("file.txt", ios::out);
    f.close();
    f.open("file.txt");
}
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
23.08.2013, 16:59  [ТС]     Работа с fstream #13
Нужно числа читать и записывать в бинарном формате. Что под этим понимается? Это что нужно число перевести к бинарному виду, а затем записать в файл и так же при чтении из файла, прочитать строку бинарную из нулей и единиц, перевести к десятичному виду и записать в переменную? Это так нужно понимать? alsav22, как думаешь и какие достоинства данного вида записи и хранения информации?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
23.08.2013, 17:26     Работа с fstream #14
ninja2, http://ru.wikipedia.org/wiki/%D0%94%...B0%D0%B9%D0%BB
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.08.2013, 18:09     Работа с fstream #15
Цитата Сообщение от ninja2 Посмотреть сообщение
Нужно числа читать и записывать в бинарном формате.
Кому нужно? Можно и так, и так. Если записали в бинарном, то читать нужно в бинарном. Записали в текстовом, читайте в текстовом. Методы текстового чтения, будут переводить полседовательность символов (цифр) в числа. При бинарном чтении данные читаются как есть, просто последовательность байтов.

Добавлено через 17 минут
Правильнее будет так: если записали данные в файл бинарными методами, то извлекать их оттуда нужно бинарными методами. Записали текстовыми методами, читайте текстовыми методами. Какие методы используете (бинарные или текстовые), в таком режиме нужно и файл открывать. Первичны методы, режимы вторичны.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
23.08.2013, 19:29  [ТС]     Работа с fstream #16
Цитата Сообщение от alsav22 Посмотреть сообщение
Кому нужно? Можно и так, и так. Если записали в бинарном, то читать нужно в бинарном. Записали в текстовом, читайте в текстовом.
Щас просто следующую задачку смотрю: "Реализуйте версии istream и ostream, которые читают и записывают числа в бинарном формате, а не переводят их в символы. Обсудите достоинства и недостатки такого подхода по сравнению со стандартным (символьным) подходом." Оценка *3.5 это по времени примерно 1-4 недели. От и думаю как ее делать. Что мне в стиле Си отрыть файл fopen("имя_файл", bin_режим) и записывать в файл fprintf(), это для ostream, а для истрим читать из файла fscanf(), а может быть тут нужно самому в ручную число переводить в биты просто число перевести в двоичную систему и уже набор символов записать в файл?

Добавлено через 1 минуту
alsav22, Cтавлю тебе спасибо за старания, такое впечатление вроде как бы ты сам не знаешь, но хоть пытаешься помочь .
alsav22
23.08.2013, 19:34
  #17

Не по теме:

Цитата Сообщение от ninja2 Посмотреть сообщение
Ладно ставлю тебе спасибо за старания
Снизошёл...
Цитата Сообщение от ninja2 Посмотреть сообщение
но хоть пытаешься помочь
Тебе - последний раз.

ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
23.08.2013, 19:39  [ТС]     Работа с fstream #18
ForEveR, Это вывод шутка там же смайлик стоит. Я просто поприкалываться. Ок буду посерьезней.

Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
Тебе - последний раз.
Нет ты что мне еще помощь понадобится, я это шутя сказал, ты мне если серьезно помог и не раз, так что не переживай.

Добавлено через 1 минуту
alsav22, Я просто впечатлительный от и поделился впечатлением, а на самом деле ты шаришь.
iifat
2179 / 1332 / 96
Регистрация: 05.06.2011
Сообщений: 3,689
24.08.2013, 02:08     Работа с fstream #19
Цитата Сообщение от ninja2 Посмотреть сообщение
alsav22, alsav22 , возможно 22 года
Эээ... ninja2 — по той же логике, тебе 2 года? Может, рановато пока ++ изучать?
А что, кстати, за компилятор? Попробовал натравить gcc — ну, я не могу повторить двухлетнему ребёнку всех матов, что я огрёб, скажу только, что немало. Первая —
test.cpp:67:15: error: ambiguous overload for ‘operator<<’ in ‘std::cout << f.pot::operator[](0)
Проще говоря, ты пишешь в cout некую хрень, которую можно преобразовать как к числу, так и к char; компилятор не может решить, к чему именно. Если твой не ругается и таки компилит — выкинь. Безо всякой жалости.
Цитата Сообщение от ninja2 Посмотреть сообщение
Так в чом же разница между бинарным режимом и без
Не помню точно, но, по-моему, исключительно в том, что символ конца строки никак не выделяется и не преобразуется. Да, ещё символ конца файла — в текстовом режиме файл читается до него, в бинарном — по длине файла. Кажется, это и вся разница.
Цитата Сообщение от ninja2 Посмотреть сообщение
C++
29
*pt <<n;
Вот это — текстовая запись в файл. Независимо от того, как было открыто.
Цитата Сообщение от ninja2 Посмотреть сообщение
alsav22, Cтавлю тебе спасибо за старания, такое впечатление вроде как бы ты сам не знаешь, но хоть пытаешься помочь
Мнэээ... Ты таки сюда за помощью, или повысить самооценку? В любом случае мешать не смею, но совместить вряд ли удастся.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2013, 03:11     Работа с fstream
Еще ссылки по теме:

Работа с файлом типа fstream C++
Работа с библиотекой <fstream> C++
C++ Не перезаписывается файл. Работа с fstream

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

Или воспользуйтесь поиском по форуму:
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
24.08.2013, 03:11  [ТС]     Работа с fstream #20
Цитата Сообщение от iifat Посмотреть сообщение
Ты таки сюда за помощью, или повысить самооценку?
Конечно за помощью, я вообще то похвалил чувачка, за то что он старался помочь, обидеть никого не хотел!
Yandex
Объявления
24.08.2013, 03:11     Работа с fstream
Ответ Создать тему
Опции темы

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