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

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

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

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

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

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

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

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

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

Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
Но, может это влияет:
Пффффф...а это не
Цитата Сообщение от Vourhey Посмотреть сообщение
К тому же, здесь играет роль реализация с++-ной библиотеки. А она различна.
что я уже писал давным-давно ))))))
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 03:36     read(); write(); #14
И вопрос про sync() остался.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
20.02.2013, 03:39     read(); write(); #15
Цитата Сообщение от alsav22 Посмотреть сообщение
И вопрос про sync() остался.
Вопрос задай по-нормальному. Потому что я вопроса не видел никакого.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 03:42     read(); write(); #16
Цитата Сообщение от Vourhey Посмотреть сообщение
Я лишь исправил твое неправильное предположение, что в линуксе данные записываются сразу. Чтобы ТС так же не думал. Потому что это неправда.
Согласен. Тогда для ТС поправлюсь. В Linux, после записи в файл, не нужно, перед последующим чтением из файла, делать flush()(в отличие от Windows). Теперь правильно?

Добавлено через 43 секунды
Цитата Сообщение от Vourhey Посмотреть сообщение
Вопрос задай по-нормальному. Потому что я вопроса не видел никакого.
10 пост.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
20.02.2013, 03:44     read(); write(); #17
Цитата Сообщение от alsav22 Посмотреть сообщение
10 пост.
Я его видел. Я не видел там вопроса.

Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
В Linux, после записи в файл, не нужно, перед последующим чтением из файла, делать flush()(в отличие от Windows). Теперь правильно?
Нет. ОС тут не при чем. Если я возьму десяток реализаций стандартной библиотеки, то они могут работать по-другому. По-моему, ты в одну кучу мешаешь два совершенно не связанных друг с другом понятия: стандартная библиотека и ОС.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 03:48     read(); write(); #18
Цитата Сообщение от Vourhey Посмотреть сообщение
Я его видел. Я не видел там вопроса.
Ещё раз посмотри.
Цитата Сообщение от Vourhey Посмотреть сообщение
По-моему, ты в одну кучу мешаешь два совершенно не связанных друг с другом понятия: стандартная библиотека и ОС.
Очень может быть.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
20.02.2013, 03:51     read(); write(); #19
Проверил, как работает, на линухе. Стандартная библиотека в данном коде не использует внутренний буфер а пишет в буфер ОС:
C
1
2
3
open("file", O_RDWR|O_CREAT|O_TRUNC, 0666) = 3
write(3, "\1\0\0\0", 4)                 = 4
read(3, "", 8191)                       = 0
И значение "1" не фейлится не потому что оно "в файле". Потому что на момент чтения оно уже находится в буфере ядра. А записалось оно, или нет уже соврешенно не важно. При чтении данные берутся из буфера ядра. Потому что он связан с дескриптором.

Добавлено через 32 секунды
Цитата Сообщение от alsav22 Посмотреть сообщение
Ещё раз посмотри.
Посмотрел. Вопрос там отсутствует.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.02.2013, 03:54     read(); write();
Еще ссылки по теме:

C++ copy on write оптимизация
write C++
C++ Функция write open не работает

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.02.2013, 03:54     read(); write(); #20
Цитата Сообщение от Vourhey Посмотреть сообщение
Стандартная библиотека в данном коде не использует внутренний буфер а пишет в буфер ОС:
Вот и я об этом! Только небольшое уточнение:"Стандартная библиотека в Linux в данном коде не использует внутренний буфер а пишет в буфер ОС..." В Windows же использует...
Yandex
Объявления
20.02.2013, 03:54     read(); write();
Ответ Создать тему
Опции темы

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