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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
#1

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

23.08.2013, 13:32. Просмотров 910. Ответов 19
Метки нет (Все метки)

Здорова!

Создал класс для записи и чтения файла через операцию [] , но почему то он работает не так как нужно.
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 (C++):

Работа с fstream - C++
Вопрос такой: какие методы есть в fstream (если конечно есть) для того, чтобы удалить файл? Мне надо именно через fstream. system(&quot;del...

Работа с Fstream - C++
Нужна программа которая выводит элементы записанные в файле в консоль. Прикол в том что нужно это сделать без указания количества элементов...

Работа с fstream - C++
Допустим у нас есть такие данные в файле: 100 - long: ilafj iwnvwj bve bvjere*/g*-er/hg h rh gnedrfgve и имеем простой класс class A...

Работа с файлами fstream - C++
есть дат файл концу этого файла надо добавить целое число: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string&gt; #include...

Работа с классом fstream.h - C++
Всем добрый день. Возникла небольшая проблемка. Открываю файл с помощью класса fstream читаю данные, а перевести курсор на начало файла...

Работа с библиотекой <fstream> - C++
Задание: Задан массив в файле в котором указана размерность и сам массив 4 * 4, нужно считать эту матрицу, обработать ее и вывести...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.08.2013, 13:37 #2
Цитата Сообщение от ninja2 Посмотреть сообщение
Что в режиме ate нельзя получается создать файл если его нету, можно только работать с уже готовыми файлами?
Зачем вам этот ate? Трудно самому курсор в конец файла передвинуть?
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
23.08.2013, 13:40  [ТС] #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
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.08.2013, 13:49 #4
Цитата Сообщение от ninja2 Посмотреть сообщение
alsav22, мне нужно по файлу перемещаться как по массиву.
И чем открытие без ate мешает это делать?
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
23.08.2013, 13:55  [ТС] #5
alsav22, Без ate нельзя курсор по потоку перемещать только данные будут добавлены в конец потока.

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

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

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

Не по теме:

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

ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
23.08.2013, 14:12  [ТС] #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
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.08.2013, 14:19 #8
Цитата Сообщение от ninja2 Посмотреть сообщение
alsav22, alsav22 , возможно 22 года.
Логика железная... Так я на форуме с 11, а сейчас 13, и всё 22? Шучу...

Добавлено через 2 минуты
Цитата Сообщение от ninja2 Посмотреть сообщение
Не знаю я думал что токо в этом режиме можно курсором двигать, без него думал нельзя.
Двигать можно во всех режимах. При этом запись не всегда в любом месте можно делать.
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
23.08.2013, 14:20  [ТС] #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
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.08.2013, 14:23 #10
Каждый раз нужно, чтобы новый создавался? Или: если нет создаётся, если есть, то не стирается, и запись в любое место?
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
23.08.2013, 14:38  [ТС] #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
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.08.2013, 15:48 #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
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
23.08.2013, 16:59  [ТС] #13
Нужно числа читать и записывать в бинарном формате. Что под этим понимается? Это что нужно число перевести к бинарному виду, а затем записать в файл и так же при чтении из файла, прочитать строку бинарную из нулей и единиц, перевести к десятичному виду и записать в переменную? Это так нужно понимать? alsav22, как думаешь и какие достоинства данного вида записи и хранения информации?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
23.08.2013, 17:26 #14
ninja2, http://ru.wikipedia.org/wiki/%D0%94%...B0%D0%B9%D0%BB
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.08.2013, 18:09 #15
Цитата Сообщение от ninja2 Посмотреть сообщение
Нужно числа читать и записывать в бинарном формате.
Кому нужно? Можно и так, и так. Если записали в бинарном, то читать нужно в бинарном. Записали в текстовом, читайте в текстовом. Методы текстового чтения, будут переводить полседовательность символов (цифр) в числа. При бинарном чтении данные читаются как есть, просто последовательность байтов.

Добавлено через 17 минут
Правильнее будет так: если записали данные в файл бинарными методами, то извлекать их оттуда нужно бинарными методами. Записали текстовыми методами, читайте текстовыми методами. Какие методы используете (бинарные или текстовые), в таком режиме нужно и файл открывать. Первичны методы, режимы вторичны.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2013, 18:09
Привет! Вот еще темы с ответами:

fstream работа с файлами - C++
Помогите написать прогу или хотя бы алгоритм размещения текста в несколько столбцов! У меня идей вообще никаких нету! В работе с файлами...

Работа с файлом типа fstream - C++
Пишем несложный код: fstream file(&quot;Test.txt&quot;,ios_base::in|ios_base::app); int cnt = 0; while (cnt &lt; 3) { cerr &lt;&lt;...

Не перезаписывается файл. Работа с fstream - C++
Есть такой код std::fstream settingFile; Poco::Util::Application&amp; app = Poco::Util::Application::instance(); std::string...

fstream - C++
Дан текстовый файл. Осуществить посимвольную чередующуюся печать файла в прямом и обратном направлении в новый файл. Например, если в файле...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.08.2013, 18:09
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru