Перенаправление вторичного файла с использованием файловых дескрипторов - PullRequest
0 голосов
/ 07 апреля 2020
std::string example;
int fd = open(argv[1], O_RDONLY);   //open file on file descriptor
int newfd = dup2(fd, 0);

//do stuff with file one then open file two
std::cin >> example;
std::cout << example << std:endl;

int fd2 = open(argv[2], O_RDONLY);  //open file2 on file descriptor
int newfd2 = dup2(fd2, 0);

std::cin >> example;
std::cout << example  << std:endl;

Я некоторое время искал решение этой проблемы. Есть ли способ открыть другой файл с перенаправлением на stdin? Предполагается, что argv[1], argv[2] являются файлами.

Файл1: abcdefg

Файл2: ABCDEFG

Expected Output:
abcdefg
ABCDEFG

Current Output:
abcdefg

1 Ответ

0 голосов
/ 08 апреля 2020

Вы смешиваете необработанные системные вызовы (open, dup2) со стандартными библиотечными функциями C ++, которые предлагают операции более высокого уровня. Поскольку библиотечные функции выполняют все виды магов c в фоновом режиме, смешивание их с функциями более низкого уровня или даже с необработанными системными вызовами может создать проблемы, поскольку последние изменяют поведение программы, не давая стандартной библиотеке возможности подтвердить изменения и обновите свои внутренние данные, чтобы соответствовать изменениям.

Что вы должны сделать, это либо:

  1. Использовать только системные вызовы: open, dup2, read и write.
  2. Используйте только стандартные библиотечные функции (где это возможно): fopen, freopen, cin, cout и др. c.

Ваш Программа должна быть переписана так:

std::string example;

freopen(argv[1], "r", stdin);
// Don't forget to check for errors.

std::cin >> example;
std::cout << example << std::endl;

freopen(argv[2], "r", stdin);
// Don't forget to check for errors.

std::cin >> example;
std::cout << example  << std::endl;
...