Я ищу функцию FILE * join (FILE * a, FILE * b), эквивалентную popen("cat a b", "r");. То есть при вызове join должен создаваться новый указатель файла, который содержит весь файл a, а затем весь файл b.
Предпочтительно join должен быть ленивым, чтобы файл b не читался, пока не будет использован весь файл a.
Я хочу создавать не физический файл на диске, а виртуальный файл так же, как это делает popen.
определите пожалуйста "виртуальный" файл?
popen создает трубка для созданного процесс.
@ Tom виртуальный в том смысле, что это не реальный файл, который где-то хранится, а процесс, который лениво производит вывод.
@BlackCap Используете указатель FILE для управления им? Что ж, я буду следить за вопросом, потому что мне кажется слишком сложным иметь указатель FILE.





Есть такая функция нет. Вам нужно написать самому.
Я полный новичок в C. Не могли бы вы рассказать, как я могу создать join?
@BlackCap попробуйте это. Это создаст третий файл. Возможно, вам это не нужно, тогда вы можете просто читать файлы в цикле, сначала файл a, затем файл b.
Ссылка создает физический файл на диске, а это не то, что я ищу.
Вы не можете создать для этого переносимую функцию. Это можно сделать с fopencookie с Linux / Glibc или funopen на BSD. См .: Можно ли использовать функции, воздействующие на FILE *, на пользовательские структуры? Однако я не знаю ни одного метода для этого в Windows.
Вам просто нужно предоставить метод для чтения, который просто будет пытаться прочитать заданное количество байтов из первого дескриптора файла, который пока не имеет условия конца файла.
Это похоже на то, что я ищу
Я не думаю, что вы могли бы: по крайней мере, не создавая временный файл и не упаковывая результат в FILE*, который позволяет вам использовать «обычные» функции доступа к файлам, такие как fread() и т. д.
логика достаточно прост: чтение из a до конца файла, затем чтение из b, но вы не можете «проникнуть внутрь» процедур обработки FILE* (по крайней мере, переносимым способом, согласно Антти ответ), чтобы заставить их переключиться. из одного файла в другой.
Вы мог пишете функцию (ы), которая заменяет функции обработки файлов специфический, которые принимали два аргумента FILE*, например вы можете определить fread2(void *ptr, size_t size, size_t nmemb, FILE *stream1, FILE* stream2), который принимал два потока и читал из одного, пока он не был исчерпан, а затем переключался на другой.
Или вы можете создать свою собственную структуру FILEPAIR (возвращенную / заполненную join()), которая будет содержать ссылки на два FILE*, а затем создать специальные функции чтения, которые работают с этой структурой (например, fread2(void *ptr, size_t size, size_t nmemb, FILEPAIR *filePair).
Вот моя функция соединения, пожалуйста, смотрите Ответ Антти Хаапала, чтобы узнать о проблемах совместимости.
typedef struct {
FILE * a;
FILE * b;
} myCookie;
ssize_t join_read(myCookie * cookie, char *buf, size_t size) {
size_t s = fread(buf, 1, size, cookie->a);
if (s < size)
s += fread(buf+s, 1, size-s, cookie->b);
return s;
}
int join_close(myCookie * cookie) {
return fclose(cookie->a) | fclose(cookie->b);
}
FILE * join (FILE * a, FILE * b) {
myCookie * cookie = malloc(sizeof(myCookie));
cookie->a = a;
cookie->b = b;
return fopencookie(cookie, "r", (cookie_io_functions_t)
{ join_read
, NULL
, NULL
, join_close });
}
Поскольку это уже специфично для Linux, мы также можем определить функцию:
FILE * empty () {
return fopen("/dev/null", "r");
}
Теперь указатели файлов образуют моноид под join и empty!
Вы используете неправильные термины. Вам нужна функция для создания нового файла, который является объединением двух других файлов. По-видимому, вам не хватает хотя бы желаемого имени в качестве параметра.