Есть ли нулевое устройство в Matlab?

Я пытаюсь найти простой способ включения и выключения ведения журнала в текстовый файл, как в примере, показанном здесь в Питон. Их решение состояло в том, чтобы использовать допустимое имя файла, где желательно ведение журнала, и использовать нулевое устройство 'dev/null' иначе. Они используют перенаправление, но я хочу использовать fopen.

Есть ли способ сделать что-то вроде следующего, какое слово работает для систем Unix или Windows, если это имеет значение.

nullFID = fopen('/dev/nul', 'w')

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


person jxramos    schedule 04.02.2016    source источник


Ответы (2)


Похоже, это можно сделать, кто-то опубликовал ответ на MathWorks, используя аналогичный термин. "пустого файла". Не уверен, что это верная терминология, но может быть сокращением от «файла нулевого устройства».

Способ ссылки на нулевое устройство зависит от ОС...

nullFID = fopen( 'NUL:'    ); % Windows
nullFID = fopen('/dev/null'); % UNIX

И также кажется, что ссылка отличается от выпусков Matlab. Рассмотрим следующий скрипт

ver
nullFID = fopen( 'NUL:' , 'w' )
fprintf( nullFID , '12345' )
nullFID = fopen( 'NUL:'  )
fprintf( nullFID , '12345' )
nullFID = fopen('NUL' , 'w' )
nullFID = fopen('NUL' )

И следующий вывод сгенерирован из двух версий Matlab...

R2011b

>> ver
-------------------------------------------------------------------------------------
MATLAB Version 7.13.0.564 (R2011b)
MATLAB License Number: xxxx
Operating System: Microsoft Windows 7 Version 6.1 (Build 7601: Service Pack 1)
Java VM Version: Java 1.6.0_17-b04 with Sun Microsystems Inc. Java HotSpot(TM) 64-Bit Server VM mixed mode
-------------------------------------------------------------------------------------
MATLAB                                                Version 7.13       (R2011b)

>> nullFID = fopen( 'NUL:' , 'w' )
nullFID = 119

>> fprintf( nullFID , '12345' )
ans = 5

>> nullFID = fopen( 'NUL:' )
nullFID = 120

>> fprintf( nullFID , '12345' )
ans = 0

>> nullFID = fopen('NUL' , 'w' )
Warning: You have chosen a reserved DOS device name for your filename.
Please choose another valid filename
nullFID = -1

>> nullFID = fopen('NUL')
nullFID = -1

R2015a

>> ver
----------------------------------------------------------------------------------------------------
MATLAB Version: 8.5.0.197613 (R2015a)
MATLAB License Number: 1093113
Operating System: Microsoft Windows 7 Professional  Version 6.1 (Build 7601: Service Pack 1)
Java Version: Java 1.7.0_60-b19 with Oracle Corporation Java HotSpot(TM) 64-Bit Server VM mixed mode
----------------------------------------------------------------------------------------------------
MATLAB                                                Version 8.5        (R2015a)

>> nullFID = fopen( 'NUL:' , 'w' )
nullFID = -1

>> fprintf( nullFID , '12345' )
Error using fprintf
Invalid file identifier. Use fopen to generate a valid file identifier.

>> nullFID = fopen( 'NUL:' )
nullFID = 8

>> fprintf( nullFID , '12345' )
ans = 0

>> nullFID = fopen('NUL' , 'w' )
Warning: You have chosen a reserved DOS device name for your filename.
Please choose another valid filename. 
nullFID = -1

>> nullFID = fopen('NUL' )
nullFID = -1
person jxramos    schedule 04.02.2016
comment
Почему w в одном случае, а не в другом? Вы также должны упомянуть, что первый для Windows, второй для Linux. - person Daniel; 05.02.2016
comment
@Daniel, я расширю ответ и включу несколько рабочих сценариев, я не уверен в роли «w», я фактически скопировал код из нескольких мест и по пути перепутал их. Это не похоже на то, что это необходимо, но похоже, что оно каким-то загадочным образом меняет идентификатор файла. - person jxramos; 05.02.2016
comment
'w' открывает файл для записи и отбрасывает существующее содержимое (в отличие от 'a', которое добавляет). Я сомневаюсь, что отказ от существующего содержимого нулевого устройства имеет смысл, так что это может быть проблемой. - person Sam Roberts; 05.02.2016
comment
@SamRoberts правильно говорит о том, что это за параметры, по сути, открытый режим или, на языке Matlab, параметр разрешения. Permission: String that describes the type of access for the file: read, write, append, or update. Also specifies whether to open files in binary or text mode, но я думаю, что я небрежно пытался сказать, что не понимаю роли настройки разрешения в контексте нулевого устройства. Я удалю его, так как он всегда работает только без разрешений. - person jxramos; 05.02.2016
comment
Если вы опустите разрешение, по умолчанию будет установлено значение 'r', что означает «только для чтения», что не имеет особого смысла для нулевого устройства. - person Sam Roberts; 05.02.2016
comment
Вот это интересный поворот! - person jxramos; 05.02.2016

R2018a

Ни одно из приведенных выше предложений больше не работает в R2018a:

>> ver matlab
-----------------------------------------------------------------------------------------------------
MATLAB Version: 9.4.0.813654 (R2018a)
Operating System: Microsoft Windows 10 Pro Version 10.0 (Build 16299)
Java Version: Java 1.8.0_144-b01 with Oracle Corporation Java HotSpot(TM) 64-Bit Server VM mixed mode
-----------------------------------------------------------------------------------------------------
MATLAB                                                Version 9.4         (R2018a)
>> nullFID = fopen( 'NUL:' , 'w' )
Error using fopen
The file name contains characters that are not contained in the filesystem encoding.
 Certain operations may not work as expected.

>> fprintf( nullFID , '12345' )
Undefined function or variable 'nullFID'.

>> nullFID = fopen( 'NUL:' )
Error using fopen
The file name contains characters that are not contained in the filesystem encoding.
 Certain operations may not work as expected.

>> fprintf( nullFID , '12345' )
Undefined function or variable 'nullFID'.

>> nullFID = fopen('NUL' , 'w' )
Warning: You have chosen a reserved DOS device name for your filename.
Please choose another valid filename. 

nullFID =

    -1

>> nullFID = fopen('NUL' )

nullFID =

    -1
person user3443139    schedule 25.03.2018