Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для BESSON_off
3 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 351

Работа с файлом типа fstream

07.02.2014, 16:42. Показов 2225. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишем несложный код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
fstream file("Test.txt",ios_base::in|ios_base::app);
 
int cnt = 0;
 
while (cnt < 3)
{
cerr << char(file.get());
cnt++;
}
 
//file.seekp(0); //Если это прописать, то заработает
 
file << "TEST"; //Это не работает
Проанализировал следующее:
  • позиционирование в файле падает на 3 символ (auto position = file.tellp()).
  • поток находиться в рабочем состоянии (file.good() == true)
  • если перед записью подвинуть (в любую сторону) указатель позиции в файле (file.seekp(0/ios_base::beg/ios_base::end)), то код заработает.

Почему запись в файл не работает без бубна (явного указания позиции)?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.02.2014, 16:42
Ответы с готовыми решениями:

Работа с типизированным файлом типа record. Вставить в центр файла еще запись
Создать типизированный файл. 1)ввести несколько записей.2)вставить запись после некоторой по запросу. как создать файл я знаю. Как добавть...

GUI Работа с текстовым файлом, лог файлом не мешая системе
Хочу написать прогу которая будет по таймеру искать в тхт - лог файле сообщение об ошибке. Например Error: 100 Qt C++ gui изучаю недавно...

Необходимо разобраться с объектом типа fstream (конкретнее, с операторами << и >>)
Нужно считать из текстового файла какое-то число и записать туда другое число: #include &lt;fstream&gt; using namespace std; ...

13
245 / 246 / 38
Регистрация: 08.04.2013
Сообщений: 927
07.02.2014, 17:46
BESSON_off, ща посмотрим

Добавлено через 5 минут
наверное, потому что файл открыт для чтения, а не для записи?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
07.02.2014, 18:37
Потому что ios_base::app устанавливает текущую позицию в конец файла.
0
245 / 246 / 38
Регистрация: 08.04.2013
Сообщений: 927
07.02.2014, 19:05
Цитата Сообщение от 0x10 Посмотреть сообщение
Потому что ios_base::app устанавливает текущую позицию в конец файла.
и что?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
07.02.2014, 19:10
Ок, не заметил, что там попытка записи... брр
0
 Аватар для BESSON_off
3 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 351
07.02.2014, 20:37  [ТС]
Пример корректен, ищу логику явного указания позиционирования. Почему без этого не работает?
0
245 / 246 / 38
Регистрация: 08.04.2013
Сообщений: 927
07.02.2014, 21:15
Цитата Сообщение от BESSON_off Посмотреть сообщение
Пример корректен, ищу логику явного указания позиционирования. Почему без этого не работает?
может "почему с этим работает"?
Потому что ответ на Ваш вопрос я дал выше. Открыли на чтение-читайте поток, а не пишите в него) или я чего-то не понимаю?

Добавлено через 27 минут
BESSON_off, я тут немного покодил, почитал. что мы видим: после выполнения цикла(если файл) пуст, file.good() вернет 0, это означает, что согласно этой статье запись в файл производится не будет. Дальше. Не знаю как у Вас, но у меня даже после позиционирования, запись не произойдет, потому что seekp не меняет состояние потока(для тестов использовалась VS 2010)
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
08.02.2014, 06:40
Цитата Сообщение от metaluga145 Посмотреть сообщение
Открыли на чтение-читайте поток, а не пишите в него) или я чего-то не понимаю?
Поток создан для чтения и записи, файл открыт в режиме чтения/дозаписи (чтение из любого места, запсиь только в конец). Так что с этим всё нормально.
Цитата Сообщение от metaluga145 Посмотреть сообщение
после выполнения цикла(если файл) пуст,
Тут речь идёт не о пустом файле. С путым всё понятно, в потоке ошибка, и ни seekp() не будет работать, ни что другое.

Если поток для чтения и записи, то переход от чтения к записи так сделан: или отсоединить файл от потока и снова соединить, или передвинуть курсор в позицию записи. В данном случае, куда не передвигай, запись - только в конец. От чтения же к записи можно сразу переходить (только буфер записи не забыть очистить).
Цитата Сообщение от BESSON_off Посмотреть сообщение
ищу логику явного указания позиционирования.
Логика, вероятно, в том, что чтение безопасно, а запись потенциально опасна, поэтому дополнительно нужно указать позицию куда писать после чтения, а не писать автоматически в позицию чтения. Но это только предположение, возможно есть какие-то технические причины.
0
11 / 10 / 7
Регистрация: 07.05.2013
Сообщений: 248
08.02.2014, 14:38
запись в файл делается следующим образом:
C++
1
2
3
4
5
6
ofstream file("test.txt");//открываем файл для записи
for (int i=0; i <10; i++);
{
   file << i; // циклом записываем i в файл
}
file.close();
0
 Аватар для BESSON_off
3 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 351
08.02.2014, 19:05  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Логика, вероятно, в том...
Это программирование, тут все упорядочено. Нужен конкретный механизм работы. Так, если бы я прочитал файл до конца (while (file.get(ch)) cerr << ch, то перед записью нужно было бы сбросить флаг конца строки, на который он бы указывал, и тогда запись бы прошла. А тут мы прочли всего 3 символа и позиция указывает на 3 символ, поток работоспособный, а запись не проходит... What are fuck?

Добавлено через 15 секунд
Цитата Сообщение от alsav22 Посмотреть сообщение
Логика, вероятно, в том...
Это программирование, тут все упорядочено. Нужен конкретный механизм работы. Так, если бы я прочитал файл до конца (while (file.get(ch)) cerr << ch, то перед записью нужно было бы сбросить флаг конца строки, на который он бы указывал, и тогда запись бы прошла. А тут мы прочли всего 3 символа и позиция указывает на 3 символ, поток работоспособный, а запись не проходит... What are fuck?
0
245 / 246 / 38
Регистрация: 08.04.2013
Сообщений: 927
08.02.2014, 19:08
BESSON_off, если в фале больше 3х символов, то все работает без позиционирования(не забывайте закрывать файл)
0
 Аватар для BESSON_off
3 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 351
08.02.2014, 20:09  [ТС]
Цитата Сообщение от metaluga145 Посмотреть сообщение
не забывайте закрывать файл
Не написал file.close() в примере для краткости.
Цитата Сообщение от metaluga145 Посмотреть сообщение
если в фале больше 3х символов, то все работает
В этом то и проблема, что без явного позиционирования запись не происходит, в файле более 3 символов.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
09.02.2014, 05:48
Цитата Сообщение от metaluga145 Посмотреть сообщение
ESSON_off, если в фале больше 3х символов, то все работает без позиционирования
Может другой компилятор или ОС? В Windows, студия 10, не работает.

Добавлено через 13 минут
В mingw работает, но там файл по-другому нужно открывать (ios::in | ios::out | ios::app). Если открывать так, как у ТС, то запись вообще не будет работать (в студии будет), даже если позицию курсора указывать.
Реализации добавляют свои особенности.
1
 Аватар для BESSON_off
3 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 351
11.02.2014, 19:24  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Реализации добавляют свои особенности
Я уж думал меня парадигма подводит =)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.02.2014, 19:24
Помогаю со студенческими работами здесь

Ошибка при передаче по значению переменной типа fstream
При вызове функции MassStep компилятор выдает следующую ошибку: Project V10.cpp(82): call to deleted constructor of 'std::fstream' (aka...

Копирование в текстовый файл из потока fstream массива типа char
Всем привет! У меня довольно простой, но очень важный для меня вопрос, ответ на который пока не очевиден... Если я средствами Windows...

При работе fstream указатель типа pos_type (позиции в файле) не работает
Разбираю код с сайта: http://valera.asf.ru/cpp/book/c20.html Компилятор Билдер-6 ругается. когда я создаю консольное приложение и...

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

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru