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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
#1

read(); write(); - C++

20.02.2013, 01:59. Просмотров 1379. Ответов 28
Метки нет (Все метки)

Вот такая вот небольшая программка

C++
1
2
3
4
5
6
fstream myFileReader("hardware.dat", ios::in | ios::out);
 
    int example = 1;
    myFileReader.write((char*) &example, sizeof(example));
    myFileReader.read((char*) &example, sizeof(example));
    cout << example;
У меня она выводит бред типа -803434434; только у меня такое?( просто боюсь, что на моём компьютере что-то со шрифтами, либо в коде я напортачил. Оказалось, что виноваты не шрифты моей винды. Но в самоучителе явно приведён похожий код на запись и чтение файлов, но там вывод почему-то абсолютно адекватный, а у меня мусор.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.02.2013, 01:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос read(); write(); (C++):

Функции write и read - C++
Здравствуйте, уважаемые! Вопросы по работе с файлом через fstream. Возник вопрос по поводу записи структуры в нужном месте файла....

Read and write binary file - C++
Ребята, срочно нужна помощь. Записываю класс Message с сообщениями в файл. struct Head { public: int who; int to; ...

Существуют ли в C++ аналоги делфийских write и read? - C++
Только час назад начал изучать С++ обшарил пол интернета но что то так и не соображу , есть ли тут аналог Делфевских Write и read ...

В чем разница между f.read(),f.write() и f<<., f>>.? - C++
В чем разница между f.read(),f.write() и f&lt;&lt;..., f&gt;&gt;...?

ofstream & ifstream :: binary read-write struct - C++
Не пойму в чем дело... но я не могу считать всю структуру FNTBINARY из файла, файл - это она и есть в бинарном виде, одна структура...

Передать из одного файла в другой текст построчно посредством read() write() - C++
# include &lt;iostream&gt; # include &lt;vector&gt; # include &lt;fstream&gt; # include &lt;string&gt; using namespace std; int main () { ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 02:08 #2
Попробуйте после myFileReader.write() вставить: myFileReader.flush();, чтобы записанное, перед чтением, из буфера в файл попало. И чтобы файл существовал.
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
20.02.2013, 02:15  [ТС] #3
Действительно, помогло. А почему write автоматически этого не делает? То есть мы можем перед тем, как кинуть в файл добавить в буфер ещё какие-либо данные?
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 02:23 #4
Цитата Сообщение от kebal Посмотреть сообщение
А почему write автоматически этого не делает?
Так реализован.

Добавлено через 3 минуты
Цитата Сообщение от kebal Посмотреть сообщение
То есть мы можем перед тем, как кинуть в файл добавить в буфер ещё какие-либо данные?
По другому, просто продолжить запись. Она идёт сначала в буфер. В файл из буфера, если не ошибаюсь, записанное попадает или при очистке буфера(flush()), или при закрытии файла. Это в Windows. В Linux, насколько знаю, записанное сразу попадает в файл.
Vourhey
Почетный модератор
6478 / 2253 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
20.02.2013, 02:49 #5
Цитата Сообщение от kebal Посмотреть сообщение
А почему write автоматически этого не делает?
1. Потому что оптимизация. Представь какая нагрузка на диск будет, если при каждом чихе система будет писать информацию на диск. Копируешь ты какой-нибудь фильм себе на диск и будешь ворон считать, пока тебе редактор файл с кодом, например, на том же диске откроет. Потому что диск видите ли полностью занят записыванием твоего фильма. Образно.
Ну, или твоя программа будет висеть и ждать, пока данные на диск не запишутся. Вместо того, чтобы отдать их системе, сразу продолжить выполнение и забыть про них. ОС сама решит, когда ей удобнее сбросить.
2. Потому что пишет в свой внутренний буфер С++-ного потока еще перед тем, как это куда-то дальше в системные вызовы пойдет.
Цитата Сообщение от alsav22 Посмотреть сообщение
Она идёт сначала в буфер. В файл из буфера, если не ошибаюсь
Точнее, из буфера потока C/С++, в файловый буфер ОС, потом уже на диск.
Цитата Сообщение от alsav22 Посмотреть сообщение
В Linux, насколько знаю, записанное сразу попадает в файл.
Нет. С чего бы вдруг? Выше, как раз и описано, как работает в Linux.
Но и там, и там, можно открыть файл с опцией, которая отключает системную буферизацию. Так же, можно отключать буферизацию и в библиотечных вызовах.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 02:59 #6
Цитата Сообщение от Vourhey Посмотреть сообщение
Нет. С чего бы вдруг? Выше, как раз и описано, как работает в Linux.
Тогда вопрос. Код ТС вызовет в Linux ошибку, приведённую в первом посте, или нормально отработает?
Vourhey
Почетный модератор
6478 / 2253 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
20.02.2013, 03:09 #7
Цитата Сообщение от alsav22 Посмотреть сообщение
Тогда вопрос. Код ТС вызовет в Linux ошибку, приведённую в первом посте, или нормально отработает?
Как разница? Это не имеет отношения к тому, как работают буферы в системе. А их, как минимум, два - библиотечный буфер и буфер ОС. И нет такого, что
Цитата Сообщение от alsav22 Посмотреть сообщение
записанное сразу попадает в файл.
Иначе бы все люди, что работают на Linux, уже давно бы повесились, включая меня.
К тому же, здесь играет роль реализация с++-ной библиотеки. А она различна.

Добавлено через 5 минут
Это я к тому, что тест "а запусти это на линухе" ничего не говорито том, как в системе пишутся данные. Вообще ничего. И смысла это обсуждать я не вижу. Почитай.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 03:14 #8
Цитата Сообщение от Vourhey Посмотреть сообщение
Это я к тому, что тест "а запусти это на линухе" ничего не говорито том, как в системе пишутся данные. Вообще ничего.
Согласен. Я об этом не спорю, потому что не знаю. И если код ТС в Linux отработает без ошибок (а скорее всего, так и будет), то это не значит, что я всё правильно написал о буферизации. Просто интересует конкретная работа конкретного кода в конкретной ОС. Поэтому и спросил.
Vourhey
Почетный модератор
6478 / 2253 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
20.02.2013, 03:18 #9
Цитата Сообщение от alsav22 Посмотреть сообщение
а скорее всего, так и будет
Обоснуй, каким образом это зависит от ОС?
Цитата Сообщение от alsav22 Посмотреть сообщение
то это не значит, что я всё правильно написал о буферизации
Ну про Linux написано неправильно. Он не пишет сразу в файл на диск. В нем точно также есть буферизация.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 03:22 #10
Цитата Сообщение от Vourhey Посмотреть сообщение
Ну про Linux написано неправильно
Согласен, не спорю, но по моему, в Linux это всё как-то по другому сделано. Там, например, для очистки потока не срабатывает sync(). Это проверял и не раз.

Добавлено через 3 минуты
Цитата Сообщение от Vourhey Посмотреть сообщение
Обоснуй, каким образом это зависит от ОС?
Я не знаю от чего это зависит. На практике сталкивался с разницой. Може зависит от реализации компиляторов под разные ОС, может ещё от чего, но разница есть.
Vourhey
Почетный модератор
6478 / 2253 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
20.02.2013, 03:28 #11
Цитата Сообщение от alsav22 Посмотреть сообщение
в Linux это всё как-то по другому сделано
Что по-другому? Есть буфер внутренний библиотечный. Когда ты пишешь через стримы, данные попадают туда.
Когда данные переваливают через определенную границу, они записываются через системные вызовы. Системные вызовы эти данные отправляют во внутренний буфер ядра связанный с файловым дескриптором.
И потом, когда ОС решит, что настало время записать данные на диск, ядро сбрасыает данные, или их часть.
Ну и тут устройство со своим буфером, если у него есть.

Добавлено через 4 минуты
Цитата Сообщение от alsav22 Посмотреть сообщение
Може зависит от реализации компиляторов под разные ОС
Компилятор с записью данных общего ничего не имеет От стандартной библиотеки. Буферизация в ОС тут роли не играет.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 03:33 #12
Цитата Сообщение от Vourhey Посмотреть сообщение
Что по-другому?
Если бы знал, то сказал бы и не спрашивал. На практике сталкивался, что разница есть. Отчего зависит, без понятия. Код ТС отработает в Linux без ошибки, в Windows с ошибкой. Значит разница в чём-то есть?

Добавлено через 2 минуты
Цитата Сообщение от Vourhey Посмотреть сообщение
Буферизация в ОС тут роли не играет.
Но, может это влияет:
Цитата Сообщение от Vourhey Посмотреть сообщение
Есть буфер внутренний библиотечный
Vourhey
Почетный модератор
6478 / 2253 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
20.02.2013, 03:35 #13
Цитата Сообщение от alsav22 Посмотреть сообщение
Значит разница в чём-то есть?
Ты можешь выяснять в чем разница, сколько хочется. Я лишь исправил твое неправильное предположение, что в линуксе данные записываются сразу. Чтобы ТС так же не думал. Потому что это неправда. А, в чем разница можешь начинать выяснять. Но она 100% не в том, что ты написал.

Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
Но, может это влияет:
Пффффф...а это не
Цитата Сообщение от Vourhey Посмотреть сообщение
К тому же, здесь играет роль реализация с++-ной библиотеки. А она различна.
что я уже писал давным-давно ))))))
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 03:36 #14
И вопрос про sync() остался.
Vourhey
Почетный модератор
6478 / 2253 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
20.02.2013, 03:39 #15
Цитата Сообщение от alsav22 Посмотреть сообщение
И вопрос про sync() остался.
Вопрос задай по-нормальному. Потому что я вопроса не видел никакого.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.02.2013, 03:39
Привет! Вот еще темы с ответами:

Как при помощи ф-ий read/write записать в файл, а потом считать с него - C++
Такой вопрос! Как при помощи ф-ий read/write записать в файл, а потом считать с него различные типы данных, как int,double, char, char. ...

Пример функции для изменения региона защиты памяти процесса с Read Only на Write Copy - C++
будьте добры привести пример функции для изменения региона защиты памяти процесса с Read Only на Write Copy VirtualAlloc - не подходит

write - C++
Нужно записать данные контейнера в файл: #include&lt;iostream&gt; #include&lt;string&gt; #include&lt;vector&gt; #include&lt;fstream&gt; ...

Write из fstream - C++
Здравствуйте!) Не могу понять, как пишет данные в файл функция write( То есть мы с помощью seekp указали позицию в потоке (файле) и...


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

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

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