LINUX.ORG.RU

Как засунуть в стандартный поток два файла и считать их?


0

1

Здравствуйте!

Пишется программа на минимальном C/C++. Программа должна брать исходные данные из стандартного потока ввода. Исходные данные - это содержимое двух файлов.

То есть, программа должна уметь запускаться как из консоли, а так же и другой программой, которая генерирует содержимое двух файлов «на лету».

Со считыванием _одного_ файла воспросов нет. Вызов происходит так:

$ ./solver < file1.txt

Считывание всех байтов в C-коде выглядит так:

 char buf[MAX_DATA_SIZE];

 int i=0;
 while(!feof(stdin) && i<MAX_DATA_SIZE)
  buf[i++]=fgetc(stdin);

 log("Read '%d' bytes from standart input stream\n", i);

Проблема в том, как считать из стандарного потока _два_ файла. То есть, видимо проблема в том, как определить где оканчивается один файл и начинается второй.

Еще проблема - какой командой засунуть в стандартный поток содержимое двух файлов? Вот такая команда засовывает ли два файла или нет:

$ ./solver < file1.txt < file2.txt

?

ну возьми какой-нибудь удобный контейнер, с помощью которого можно из двух файлов сделать один. Например tar

maxcom ★★★★★ ()

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

proud_anon ★★★★★ ()

>как определить где оканчивается один файл и начинается второй.

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

proud_anon ★★★★★ ()

по символу конфа файла EOF ты можешь определить что первый кончился и начался второй, для бинарный файлов способ не катит

wfrr ★★☆ ()

>while(!feof(stdin) && i<MAX_DATA_SIZE) buf[i++]=fgetc(stdin);

while(i=fread(buf, 1, MAX_DATA_SIZE, stdin))
  printf("Read '%d' bytes from standart input stream\n", i);
anon_666 ()
Ответ на: комментарий от const86

> ./solver 8 5 8< file1.txt 5< file2.txt

Самое правильное решение. Перенаправить ввод на нестандартные дескрипторы, например 5 и 8, открыть их в программе и читать.

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

annoynimous ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.