Как перенаправить stdin в файл?

#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
  

В этом примере я использую >> для добавления строки в конце файла, но вы можете перезаписать ее с помощью >