Перезаписать/заместить текст в файле

 

Добрый день. Возник вопрос при множественной работе с одним файлом.

Есть файл Abc.txt, который имеет текст:

Начальный депозит: 3000
Уровень стопа: 70

Нужно стереть весь уже существующий текст и вписать новый:

Начальный депозит: 3500.35
Уровень стопа: 25

Программно файл открывается с флагами "READ/WRITE/TXT". При работе с ним  сначала нужно прочесть его данные, а потом перезаписать.

Если просто воспользоваться функцией FileWrite (), то новый текст будет добавлен в конец файла. Не годится.
Когда пользуемся смещением позиции в начало файла через функцию FileSeek (SEEK_SET), вроде старый текст замещается новым. То, что нужно.

Но если новый текст по количеству символов (байтов) меньше старого, то часть старого текста остается:

Начальный депозит: 3500.35
Уровень стопа: 25
70

Как все-таки заместить файл новыми данными и сделать это правильно?

 

Только переписать все заново.

Альтернативное решение - предусмотреть для цифры сразу все нужные разряды (в данном случае 7), и даже если нужно записать в это место меньше - дополнять пробелами.

 

К сожалению размер файла в этом режиме нельзя сделать меньше. Поэтому и остаются незатертые символы. Вариантов два: прежде чем записывать новые строки, затереть файл нуль-байтами или пробелами, а затем писать сообщение.

Второй вариант создать вместо текстового файла, бинарный, с фиксированной длинной. У Вас именно тот случай, когда в файле хранятся два и только два числа, поэтому длина файла будет всегда одинаковой.

 
Если откроете файл только для записи, то все данные в существующем файле будут затерты, файл станет нулевой длинны.
 
Alexander Bereznyak:
Если откроете файл только для записи, то все данные в существующем файле будут затерты, файл станет нулевой длинны.
Не зачет. Файл используется для многопоточного чтения/записи и его блокировка в режиме записи неприемлема.
 

Откройте, запишите и закройте. Две строчки, много времени не надо. А в других программах проверка на возможность открытия файла, если не открылся то

через время повторная попытка. 

 
Roman Starinskiy:

Добрый день. Возник вопрос при множественной работе с одним файлом.

Есть файл Abc.txt, который имеет текст:

Нужно стереть весь уже существующий текст и вписать новый:

Программно файл открывается с флагами "READ/WRITE/TXT". При работе с ним  сначала нужно прочесть его данные, а потом перезаписать.

Если просто воспользоваться функцией FileWrite (), то новый текст будет добавлен в конец файла. Не годится.
Когда пользуемся смещением позиции в начало файла через функцию FileSeek (SEEK_SET), вроде старый текст замещается новым. То, что нужно.

Но если новый текст по количеству символов (байтов) меньше старого, то часть старого текста остается:

Как все-таки заместить файл новыми данными и сделать это правильно?

Как вариант, удалить файл и создать его заново.
 

Надо блокировать файл при записи, чтобы никто не смог читать, пока запись не закончится. Иначе что вы прочитаете?

При чтении надо делать проверку на ошибку при открытии.  Так-что при записи открываем файл для записи, при этом файл очистится.

 
Вот и я о том толкую, а вы сразу не зачет, студент я что ли, а вы мой преподаватель.
 
Vasiliy Sokolov:
Не зачет. Файл используется для многопоточного чтения/записи и его блокировка в режиме записи неприемлема.
Разве, когда файл открывает одна программа, доступ к нему из других программ не блокируется пока первая программа не закроет его?
 
Если использовать режим FILE_WRITE|FILE_READ, то доступ будет заблокирован, а если добавить режим FILE_SHARE_WRITE|FILE_SHARE_READ, то нет.
Причина обращения: