Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Roman Starinskij
1870
Roman Starinskij  

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

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

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

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

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

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

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

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

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

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

George Merts
3746
George Merts  

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

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

Vasiliy Sokolov
22714
Vasiliy Sokolov  

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

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

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

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

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

Alexey Volchanskiy
17144
Alexey Volchanskiy  
Roman Starinskiy:

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

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

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

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

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

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

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

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

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

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

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