#c #linux #redirect #gcc #stdin
#c #linux #перенаправление #gcc #stdin
Вопрос:
Я хочу перенаправить stdin в файл, чтобы я мог записывать в файл, и моя программа печатала символ. Ниже приведен простой фрагмент кода c, который печатает stdin.
Программа скомпилирована с помощью gcc и выполняется на debian 4.19.0 в virtualbox
//printchar.c
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int c;
while( (c = getchar()) !='.') {
putchar(c);
}
return EXIT_SUCCESS;
}
Я вызываю программу с ./printchar 0 < testfile.txt
Тогда я echo efghi > testfile.txt
, но ничего не происходит. Если я предварительно заполняю файл abcd, abcd печатается сразу после запуска программы, но опять же, я не могу что-либо повторить в тестовом файле.
Разве невозможно перенаправить stdin таким образом?
Комментарии:
1. Звучит так, как будто вам нужен именованный канал . man mkfifo
2. Вы можете попробовать это:
tail -f -n 1 testfile.txt | ./printchar
иecho defg > testfile.txt
на другом терминале.
Ответ №1:
Я думаю, вы можете сделать это, используя getchar
вот так:
int main(void)
{
int c;
while(1)
{
c = getchar();
if (c == '.') break;
if (c != EOF)
{
putchar(c);
}
else
{
usleep(100);
}
}
return 0;
}
или используя read
вот так:
#include <stdio.h>
#include <unistd.h>
int main()
{
char c;
int n;
while(1)
{
n = read(0, amp;c, 1);
if(n > 0)
{
if (c == '.') break;
putchar(c);
}
else
{
usleep(100);
}
}
return 0;
}
Однако вам нужно добавить к файлу с помощью >>
типа:
touch testfile.txt // create empty file
./printchar < testfile.txt // start program
echo hello >> testfile.txt // append to file
echo world >> testfile.txt // append to file
echo . >> testfile.txt // append to file
Ответ №2:
Вы также можете использовать heredoc <<
, связанный с перенаправлением в файл, подобный этому :
<< keyCodeToStopWriting >> myFile
first line
second line
keyCodeToStopWriting //Stop the writing
В этом примере я использую >>
для добавления строки в конце файла, но вы можете перезаписать ее с помощью >