Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Ведешь свой блог? Размести в нем ссылку на MQL5.community и заработай!
Roman Starinskij
1870
Roman Starinskij 2015.09.02 16:09 

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

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

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

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

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

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

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

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

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

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

George Merts
3527
George Merts 2015.09.02 16:44  

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

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

Vasiliy Sokolov
21150
Vasiliy Sokolov 2015.09.02 16:53  

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

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

Alexander Bereznyak
20997
Alexander Bereznyak 2015.09.02 16:55  
Если откроете файл только для записи, то все данные в существующем файле будут затерты, файл станет нулевой длинны.
Vasiliy Sokolov
21150
Vasiliy Sokolov 2015.09.02 16:59  
Alexander Bereznyak:
Если откроете файл только для записи, то все данные в существующем файле будут затерты, файл станет нулевой длинны.
Не зачет. Файл используется для многопоточного чтения/записи и его блокировка в режиме записи неприемлема.
Alexander Bereznyak
20997
Alexander Bereznyak 2015.09.02 17:20  

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

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

Alexey Volchanskiy
16233
Alexey Volchanskiy 2015.09.02 17:48  
Roman Starinskiy:

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

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

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

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

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

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

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

Как вариант, удалить файл и создать его заново.
Dmitry Fedoseev
42648
Dmitry Fedoseev 2015.09.02 17:59  

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

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

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