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

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

Восстановить пароль Регистрация
 
BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 329
07.02.2014, 16:42     Работа с файлом типа fstream #1
Пишем несложный код:
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)), то код заработает.

Почему запись в файл не работает без бубна (явного указания позиции)?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2014, 16:42     Работа с файлом типа fstream
Посмотрите здесь:

Работа с fstream C++
C++ Работа с классом fstream.h
C++ fstream работа с файлами
C++ Работа с fstream
C++ Работа с fstream
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
07.02.2014, 17:46     Работа с файлом типа fstream #2
BESSON_off, ща посмотрим

Добавлено через 5 минут
наверное, потому что файл открыт для чтения, а не для записи?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
07.02.2014, 18:37     Работа с файлом типа fstream #3
Потому что ios_base::app устанавливает текущую позицию в конец файла.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
07.02.2014, 19:05     Работа с файлом типа fstream #4
Цитата Сообщение от 0x10 Посмотреть сообщение
Потому что ios_base::app устанавливает текущую позицию в конец файла.
и что?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
07.02.2014, 19:10     Работа с файлом типа fstream #5
Ок, не заметил, что там попытка записи... брр
BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 329
07.02.2014, 20:37  [ТС]     Работа с файлом типа fstream #6
Пример корректен, ищу логику явного указания позиционирования. Почему без этого не работает?
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
07.02.2014, 21:15     Работа с файлом типа fstream #7
Цитата Сообщение от BESSON_off Посмотреть сообщение
Пример корректен, ищу логику явного указания позиционирования. Почему без этого не работает?
может "почему с этим работает"?
Потому что ответ на Ваш вопрос я дал выше. Открыли на чтение-читайте поток, а не пишите в него) или я чего-то не понимаю?

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

Если поток для чтения и записи, то переход от чтения к записи так сделан: или отсоединить файл от потока и снова соединить, или передвинуть курсор в позицию записи. В данном случае, куда не передвигай, запись - только в конец. От чтения же к записи можно сразу переходить (только буфер записи не забыть очистить).
Цитата Сообщение от BESSON_off Посмотреть сообщение
ищу логику явного указания позиционирования.
Логика, вероятно, в том, что чтение безопасно, а запись потенциально опасна, поэтому дополнительно нужно указать позицию куда писать после чтения, а не писать автоматически в позицию чтения. Но это только предположение, возможно есть какие-то технические причины.
wolf1396
5 / 5 / 0
Регистрация: 07.05.2013
Сообщений: 192
08.02.2014, 14:38     Работа с файлом типа fstream #9
запись в файл делается следующим образом:
C++
1
2
3
4
5
6
ofstream file("test.txt");//открываем файл для записи
for (int i=0; i <10; i++);
{
   file << i; // циклом записываем i в файл
}
file.close();
BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 329
08.02.2014, 19:05  [ТС]     Работа с файлом типа fstream #10
Цитата Сообщение от 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?
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
08.02.2014, 19:08     Работа с файлом типа fstream #11
BESSON_off, если в фале больше 3х символов, то все работает без позиционирования(не забывайте закрывать файл)
BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 329
08.02.2014, 20:09  [ТС]     Работа с файлом типа fstream #12
Цитата Сообщение от metaluga145 Посмотреть сообщение
не забывайте закрывать файл
Не написал file.close() в примере для краткости.
Цитата Сообщение от metaluga145 Посмотреть сообщение
если в фале больше 3х символов, то все работает
В этом то и проблема, что без явного позиционирования запись не происходит, в файле более 3 символов.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.02.2014, 05:48     Работа с файлом типа fstream #13
Цитата Сообщение от metaluga145 Посмотреть сообщение
ESSON_off, если в фале больше 3х символов, то все работает без позиционирования
Может другой компилятор или ОС? В Windows, студия 10, не работает.

Добавлено через 13 минут
В mingw работает, но там файл по-другому нужно открывать (ios::in | ios::out | ios::app). Если открывать так, как у ТС, то запись вообще не будет работать (в студии будет), даже если позицию курсора указывать.
Реализации добавляют свои особенности.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2014, 19:24     Работа с файлом типа fstream
Еще ссылки по теме:

Работа с Fstream C++
Копирование в текстовый файл из потока fstream массива типа char C++
При работе fstream указатель типа pos_type (позиции в файле) не работает C++

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

Или воспользуйтесь поиском по форуму:
BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 329
11.02.2014, 19:24  [ТС]     Работа с файлом типа fstream #14
Цитата Сообщение от alsav22 Посмотреть сообщение
Реализации добавляют свои особенности
Я уж думал меня парадигма подводит =)
Yandex
Объявления
11.02.2014, 19:24     Работа с файлом типа fstream
Ответ Создать тему
Опции темы

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