PDA

Просмотр полной версии : Скрипт архивирование на USB (панель СП3хх) и fseek



-=Vovka=-
04.12.2018, 15:34
Здравствуйте!
Что-то не пойму, почему не работает функция установки указателя файла на конец файла?
Все время перезаписывает файл. Вот код:


#define BUFSIZE 80
#define LF 0x0A
#define CR 0x0D

WORD TD_Array[5];
WORD kode, data;
FILE *pFile;
char buf[BUFSIZE];

pFile = fopen("log.csv", "w");
if(pFile) {
fseek(pFile, 0, SEEK_END);
snprintf(buf, (BUFSIZE-1), "%02d.%02d.%04d;%02d:%02d;%d;%d;%c%c", PSW[304],PSW[303],PSW[302], PSW[300],PSW[301], kode, data, CR, LF);
fwrite(buf, 1, strlen(buf), pFile);
fclose(pFile);
}

Владимир Ситников
04.12.2018, 15:58
-- Замените "w" на "a" и будет вам счастье. --

Эх, счастья не будет -- "a" не поддерживается.

-=Vovka=-
04.12.2018, 16:05
Замените "w" на "a" и будет вам счастье.
Вот из описания для примера "16_Архивирование с помощью макросов"
40210

-=Vovka=-
04.12.2018, 16:10
Вот исходник из примера, правда тему почему-то закрыли: http://www.owen.ru/forum/showthread.php?t=29882

petera
04.12.2018, 17:27
Что-то не пойму, почему не работает функция установки указателя файла на конец файла?
Все время перезаписывает файл
Вот исходник из примера, правда тему почему-то закрыли: http://www.owen.ru/forum/showthread.php?t=29882

Вот, что написано в википедии по поводу режима 'w' https://ru.wikipedia.org/wiki/%D0%A4%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D1%8B%D0%B9_% D0%B2%D0%B2%D0%BE%D0%B4-%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4_%D0%B2_%D1%8F%D0%B7 %D1%8B%D0%BA%D0%B5_%D0%A1%D0%B8

открывает для записи (создаёт файл в случае его отсутствия). Удаляет содержимое и перезаписывает файл.

ЗЫ.
И наконец, если файл открывается для операций чтения/ записи, то он не стирается, если он уже существует, а если такого файла нет, он создается.

Владимир Ситников
04.12.2018, 23:26
И наконец, если файл открывается для операций чтения/ записи, то он не стирается, если он уже существует, а если такого файла нет, он создается.
Wikipedia тут бессильна.

ОВЕН написали, что "режим a, a+ не поддерживается".
Лучше бы написали какой поддерживается.

Конечно, можно полным перебором какой из r, r+, rw, w, w+ приведёт к нужному результату, но документация в духе "XXX не поддержано" это нездорово.

Евгений Кислов
05.12.2018, 07:27
Здравствуйте!
Что-то не пойму, почему не работает функция установки указателя файла на конец файла?
Все время перезаписывает файл. Вот код:


Здравствуйте.
SEEK_END при записи не поддержан и не обрабатывается.
Используйте SEEK_SET и смещение - именно так, как сделано в примере.
Вообще, если руководствоваться примером - подобных проблем не будет.

Кстати, задачи, которые обычно закрывают макросами (алгоритмы управления, архивы собственного формата, нестандартные протоколы и т.д.) гораздо проще решить с помощью новых СПК1хх:
http://www.owen.ru/forum/showthread.php?t=29382

-=Vovka=-
05.12.2018, 08:25
Используйте SEEK_SET и смещение - именно так, как сделано в примере.
Вообще, если руководствоваться примером - подобных проблем не будет.

Здравствуйте!
Тогда как мне пользуясь примером сделать дозапись в файл?
Т.е. на флешке уже есть файл, записанный допустим в другой панели. Как БЫСТРО узнать конец файла? Считывать весь? А если там гигабайты?



Кстати, задачи, которые обычно закрывают макросами (алгоритмы управления, архивы собственного формата, нестандартные протоколы и т.д.) гораздо проще решить с помощью новых СПК1хх:
http://www.owen.ru/forum/showthread.php?t=29382
СП315 была куплена пару месяцев назад. Обменяете?

Евгений Кислов
05.12.2018, 08:38
Здравствуйте!
Тогда как мне пользуясь примером сделать дозапись в файл?
Т.е. на флешке уже есть файл, записанный допустим в другой панели. Как БЫСТРО узнать конец файла? Считывать весь? А если там гигабайты?

Извините - не сумел догадаться, что конечная цель - определить размер файла.

Для чтения SEEK_END работает.



#define BUFSIZE 80
#define LF 0x0A
#define CR 0x0D

WORD TD_Array[5];
WORD kode, data;
FILE *pFile;
char buf[BUFSIZE];

pFile = fopen("log.csv", "r");
if(pFile)
{
fseek(pFile, 0, SEEK_END);
PSW[300]=ftell(pFile); // size of file in bytes
fclose(pFile);
}




СП315 была куплена пару месяцев назад. Обменяете?

Обсуждаемый вопрос - напишите на support@owen.ru, пожалуйста.

-=Vovka=-
05.12.2018, 09:18
Этот вариант заработал!
Но тут появился дополнительный тормоз с двойным открытием файла: сначала на чтение, потом на запись :mad:

-=Vovka=-
05.12.2018, 09:34
По ходу возник еще один вопрос: а как узнать, что флешку можно без болезненно вытащить, что закончились все системные операции чтения-записи?
Или закрыл файл и можно флешку вытаскивать?

Евгений Кислов
05.12.2018, 09:35
Этот вариант заработал!
Но тут появился дополнительный тормоз с двойным открытием файла: сначала на чтение, потом на запись :mad:

Я правильно понимаю, что вы успеваете вытаскивать/вставлять новые флешки несколько раз в секунду?
Потому что в других ситуациях какие-либо тормоза из-за двух операций с файлом вместо одной сложно будет заметить.


Или закрыл файл и можно флешку вытаскивать?

Да, именно так.

-=Vovka=-
05.12.2018, 09:45
Я правильно понимаю, что вы успеваете вытаскивать/вставлять новые флешки несколько раз в секунду?
Потому что в других ситуациях какие-либо тормоза из-за двух операций с файлом вместо одной сложно будет заметить.
Да, именно так.
Мне интересен сам механизм закрытия файла: ведь на флешке может быть много файлов, да и со временем может притормаживать.
Так вот, закрытия файла гарантирует физическую запись на флешку или как в Виндовс есть буферизация с отложенной записью и "Безопасное извлечение устройства"?

Евгений Кислов
05.12.2018, 10:08
Не готов сходу ответить. Потерю данных при вытаскивании накопителя сразу после завершения записи я не наблюдал ни разу (а во время создания примера эта операция производилась регулярно).
В любом случае, искусственная задержка в 2-3 секунды (например, с помощью окна "Ожидайте извлечения накопителя") вполне разумна и хуже от нее не будет.

-=Vovka=-
05.12.2018, 10:12
Согласен, но хотелось бы "железобетонного" решения....

Евгений Кислов
05.12.2018, 10:14
Согласен, но хотелось бы "железобетонного" решения....

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

-=Vovka=-
05.12.2018, 10:40
В принципе, можно после записи опять проверять размер файла и если он увеличился на размер записанного буфера - то делать вывод об успешной записи в файл.
По моему тут глубже надо смотреть: на флешку мы послали данные, а вот она может притормозить и тогда если мы ее выдернули, то данные могут не успеть записаться.
Может есть механизм узнать, что контроллер флешки закончил все операции?

Евгений Кислов
05.12.2018, 10:47
По моему тут глубже надо смотреть: на флешку мы послали данные, а вот она может притормозить и тогда если мы ее выдернули, то данные могут не успеть записаться.
Может есть механизм узнать, что контроллер флешки закончил все операции?

Лучше даташит на конкретную флэшку посмотреть, но даже неадекватно большие в рамках типового применения панели объемы данных (~100 Кб, например) должны записываться за какие-то доли секунды.

-=Vovka=-
05.12.2018, 11:05
Для конечного пользователя это слишком заумно :D
Пока ограничусь окном ожидания...