Перевод потока для чтения, после получения данных из files в stdin UNIX C

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

#define ROW 25
#define COLLUMN 80

int input(int arr[ROW][COLLUMN]);
int output(int arr[ROW][COLLUMN]);

int main(void) {
  int curr[ROW][COLLUMN], prev[ROW][COLLUMN];
  input(curr);
  output(curr);
  
  return 0;
}

int input(int arr[ROW][COLLUMN]) {
  for (int i = 0; i < ROW; ++i) {
    for (int j = 0; j < COLLUMN; ++j) {
      if (scanf("%d", &(arr[i][j])) != 1) {
        
      }
    }
    printf("\n");
  }
  return 0;
}

int output(int arr[ROW][COLLUMN]) {
  for (int i = 0; i < ROW; ++i) {
    for (int j = 0; j < COLLUMN; ++j) {
      if (arr[i][j] == 1) {
        printf("o");
      } else {
        printf(" ");
      }
    }
    printf("\n");
  }
}

Данные файла sample.txt

00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000001111110000000000000000000000000000000000000000000000000000
00000000000000000000111111111100000000000000000000000000000000000000000000000000
00000000000000000011111111111110000000000000000000000000000000000000000000000000
00000000000000000111111111111111000000000000000000000000000000000000000000000000
00000000000000000111111111111111110000000000000000000000000000000000000000000000
00000000000000001111111111111111111000000000000000000000000000000000000000000000
00000000000000011111111111111111110000000000000000000000000000000000000000000000
00000000000000001111111111111111100000000000000000000000000000000000000000000000
00000000000000000111111111111111000000000000000000000000000000000000000000000000
00000000000000000011111111111110000000000000000000000000000000000000000000000000
00000000000000000001111111111100000000011111000000000000000000000000000000000000
00000000000000000000111111110000000000010101000000000000000000000000000000000000
00000000000000000000001110000000000000011111000000000000000000000000000000000000
00000000000000000000000110000000000000000110000001100000000000000000000000000000
00000000000000000000000011101000000001101111111111100000000000000000000000000000
00000000000000000000000000111100000001101111100000000000000000000000000000000000
00000000000000000000000000001110000001101111100000000000000000000000000000000000
00000000000000000000000000000101111111101111100000000000000000000000000000000000
00000000000000000000000000000000000000001101100000000000000000000000000000000000
00000000000000000000000000000000000000001101100000000000000000000000000000000000
00000000000000000000000000000000000000001101100000000000000000000000000000000000
00000000000000000000000000000000000000011101110000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000

Метод для перевода потока ./a.out < sample.txt

Как избавится и реорганизовать программу для коректного ввода данных. Чтобы считывать после символы из консоли, а не упираться в file.


Ответы (2 шт):

Автор решения: Oh-Ben-Ben

А зачем вам опираться на структуру того что может прийти ? Читайте как есть из STDIN_FILENO кусками и все что есть выкидывайте в STDOUT

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define RB_SIZE 512

int main(void)
{
    char rbuff[RB_SIZE + 1];
    ssize_t rb_size = 0;
    do
    {
        rb_size = read(STDIN_FILENO, rbuff, RB_SIZE);
        if (rb_size <= 0)
        {
            break;
        }
        write(STDOUT_FILENO, rbuff, rb_size);
    } while (rb_size > 0);

    return EXIT_SUCCESS;
}

Работает как с cat ./1.json | ./a.out так и с ./a.out < ./1.json

→ Ссылка
Автор решения: Sergey

А зачем Вы используете этот чудовищный массив? Сначала - формируете его, потом - распечатываете. Но ведь Вам нужно всего лишь убрать всё, кроме "1".

Надо просто объединить ввод и вывод. Как-то так:

int input_output(int arr[ROW][COLLUMN]) {
  int x;

  for (int i = 0; i < ROW; ++i) {
    for (int j = 0; j < COLLUMN; ++j) {
      if (scanf("%d", &x) != 1) {
        if (x == 1) {
           printf("o");
        } else {
           printf(" ");
        }
      }
    }
    printf("\n");
  }
  return 0;
}

И массив становится абсолютно не нужным.

→ Ссылка