Вы также можете использовать функцию reviver
для фильтрации.
var data = JSON.parse(jsonString, function reviver(key, value) {
//your code here to filter
});
для получения дополнительной информации см. JSON.parse
Почему использование freopen()
? Спецификация C89 имеет ответ в одном из примечаний для раздела по <stdio.h>
:
116. Основное использование
freopen
функция состоит в том, чтобы изменить файл, связанный со стандартным текстовым потоком (stderr
,stdin
, илиstdout
), поскольку те идентификаторы не должны быть модифицируемым lvalues, которому значение, возвращенноеfopen
может быть присвоена функция.
freopen
обычно неправильно используется, например, stdin = freopen("newin", "r", stdin);
. Это не более портативно, чем fclose(stdin); stdin = fopen("newin", "r");
. Оба выражения пытаются присвоить [1 110], который, как гарантируют, не будет присваиваемым.
правильный способ использовать freopen
состоит в том, чтобы опустить присвоение: freopen("newin", "r", stdin);
функция OS dup2 () должен обеспечить то, в чем Вы нуждаетесь (если не ссылки на точно, в чем Вы нуждаетесь).
Строго говоря, Вы можете dup2 () stdin дескриптор файла к другому дескриптору файла, сделать другой материал с stdin и затем скопировать его назад, когда Вы хотите.
дубликат () функция копирует открытый дескриптор файла. А именно, это предоставляет альтернативный интерфейс услуге, предоставленной fcntl () функция с помощью постоянного значения команды F_DUPFD, с 0 для его третьего аргумента. Дублированный дескриптор файла совместно использует любые блокировки с оригиналом.
На успехе, дубликат () возвращает новый дескриптор файла, который имеет следующее вместе с оригиналом:
- Тот же открытый файл (или канал)
- Тот же указатель файла (оба дескрипторов файлов совместно используют один указатель файла)
- Тот же режим доступа (чтение, запишите, или чтение-запись)
Я думаю, что Вы ищете что-то как freopen()
freopen("/my/newstdin", "r", stdin);
freopen("/my/newstdout", "w", stdout);
freopen("/my/newstderr", "w", stderr);
... do your stuff
freopen("/dev/stdin", "r", stdin);
...
...
Это достигает максимума игла на моем round-peg-square-hole-o-meter, что Вы пытаетесь выполнить?
Редактирование:
Помнят, что stdin, stdout и stderr являются дескрипторами файлов 0, 1 и 2 для каждого недавно созданного процесса. freopen () должен сохранить тот же fd's, просто присвоить новые потоки им.
Так, хороший способ гарантировать, что это на самом деле делает то, что Вы хотите, чтобы он сделал, был бы:
printf("Stdout is descriptor %d\n", fileno(stdout));
freopen("/tmp/newstdout", "w", stdout);
printf("Stdout is now /tmp/newstdout and hopefully still fd %d\n",
fileno(stdout));
freopen("/dev/stdout", "w", stdout);
printf("Now we put it back, hopefully its still fd %d\n",
fileno(stdout));
я полагаю, что это - ожидаемое поведение freopen (), как Вы видите, Вы все еще только используете три дескрипторов файлов (и связанные потоки).
Это переопределило бы любое перенаправление оболочки, поскольку не будет ничего, чтобы оболочка перенаправила. Однако его, вероятно, попытка повредить каналы. Вы могли бы хотеть убедиться настроить обработчик для SIGPIPE, в случае, если Ваша программа оказывается на блокирующемся конце канала (не FIFO, канал).
Так./your_program - stdout /tmp/stdout.txt - stderr /tmp/stderr.txt должен быть легко выполнен с freopen () и хранение тех же фактических дескрипторов файлов. То, что я не понимаю, - то, почему необходимо было бы отложить их однажды изменение их? Конечно, если бы кто-то передал любую опцию, то они хотели бы, чтобы она сохранилась до завершенной программы?
freopen
решает легкую часть. Имение в наличии старого stdin не трудно, если Вы ничего не считали и если Вы готовы использовать системные вызовы POSIX как dup
или dup2
. Если Вы запускаетесь для чтения из него, все ставки выключены.
, Возможно, можно ли сказать нам контекст, в котором происходит эта проблема?
я поощрил бы Вас придерживаться ситуаций, где Вы готовы отказаться старый stdin
и stdout
и можете поэтому использовать freopen
.
Это модифицированная версия метода Тима Поста; Я использовал / dev / tty вместо / dev / stdout. Я не знаю, почему это не работает со стандартным выводом (это ссылка на / proc / self / fd / 1):
freopen("log.txt","w",stdout);
...
...
freopen("/dev/tty","w",stdout);
При использовании / dev / tty вывод перенаправляется на терминал, с которого было запущено приложение.
Надеюсь, эта информация будет полезной.