質問
私はstdinの内容を逆にする方法についていくつかのアドバイスが必要です。これは私のコードの一部であり、stdinの逆転を処理します:
int reversestdin(FILE *file)
{
int a, b;
int lineas=0;
while ((a=fgetc(stdin)) !=EOF)
{
if (a=='\n')
lineas++;
}
for(b=0; b<lineas; b++)
{
rewind(stdin);
int d,len, e;
char str[2048], *ptr;
for(e=0; e<=b; e++)
{
fgets(str, 2048, stdin);
}
ptr=str;
for(d=0; d<2048; d++)
{
if(*ptr=='\n') break;
if(*ptr=='\0') break;
ptr++;
}
len=d;
ptr--;
for(d=len; d>0; d--)
{
printf("%c", *ptr--);
}
printf("\n");
}
return 0;
}
私も持っています.example1と呼ばれるtxtファイルには、次の内容が含まれています:
LINE 1.1
LINE 1.2
LINE 1.4
このコードは、私が実行したときに動作します ./myprogram < example1.txt
.それは出力します
1.1 ENIL
2.1 ENIL
4.1 ENIL
しかし、私が実行した場合 echo "This text should be reversed" | ./myprogram
それは出力します:
(
それだけです。開いたブラケット。私は、行を数えるコードの部分を省略し、手動で1行があると言うと、それが機能することを発見しました(もちろん1行の場合)。
int reversestdin(FILE *file)
{
int a, b;
int lineas=1;
//while ((a=fgetc(stdin)) !=EOF)
//{
//if (a=='\n')
//lineas++;
//}
for(b=0; b<lineas; b++)
{
rewind(stdin);
int d,len, e;
char str[2048], *ptr;
for(e=0; e<=b; e++)
{
fgets(str, 2048, stdin);
}
ptr=str;
for(d=0; d<2048; d++)
{
if(*ptr=='\n') break;
if(*ptr=='\0') break;
ptr++;
}
len=d;
ptr--;
for(d=len; d>0; d--)
{
printf("%c", *ptr--);
}
printf("\n");
}
return 0;
}
それは今出力します
desrever eb dluohs txet sihT
解決
まず、巻き戻し stdin
(理論的には)入力ファイルからリダイレクトされていない限り、サポートされていません。そして、それが起こったことを知る方法はありません(とにかく私は知っています)ので、それを試して気にしないでください。
それは明らかに一般的な意見であるものに反して、あなたは入力全体をバッファする必要はありません、と述べました。あなたはまだそれを一度にバッファリングすることができます:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int buffer[2048], ch, lines=0, i=0;
do
{
ch = fgetc(stdin);
if ((ch == '\n') ||
(ch == EOF && i > 0) ||
(i == (sizeof(buffer)/sizeof(*buffer)-1)))
{
++lines;
while (i != 0)
fputc(buffer[--i], stdout);
fputc('\n', stdout);
}
else
{
buffer[i++] = ch;
}
} while (ch != EOF);
return 0;
}
それはあなたが探していることをすることをかなり確信しています(またはとにかくそれに近い)
他のヒント
stdin
を巻き戻すことはできません!
前に行をカウントしようとするのではなく、EOF
まで読み込んだようにロジックを修正する必要があります。
見るもう一つのことは、行をカウントするあなたの声明です...
編集:Manipulateを使用できる変数に等しい設定STDINも提案します。それで、temp = stdin
のようなものがあるので、あなたはいつもその最初のStdinを持っているでしょう、そしてあなたが必要に応じて操作することができます、そしてあなたが戻る必要があるならば、あなたはまだstdinを持っています。
while ((a=fgetc(stdin)) !=EOF)
{
if (a=='\n')
lineas++;
}
.
あなたがそれについて考えるならば、あなたが置くべきその行は新しい行文字を持っていないので、あなたのプログラムはまだ0行があると考えています。だから私は最初にlineas = 1
を設定します。
考慮すべきもう1つのことは、 Magic Numbers と呼ばれるものです。それがあなたの2048年のものです。 2048を「グローバル」変数にすることで、私はそれを修正することを調べます。
提案された流れ
if lineas == 0 then check for characters
ステートメントではなく、while
ステートメントを使用します。しかし、Aはfor
であるため、while(a != EOF)
を実行し続けます。次に、配列の最後にあるサイズ2048の文字配列に入れるだけで、後方に動作します(または、それを0から文字配列に入れることができます。ただし、ただし、後方になるループがあります。カウンターが便利になる場所)。しかし、char
を持ち、ラインを後方に印刷し、アレイインデックスを2048にリセットします。また、キャラクタ数を数えるカウンターを数えることもできます。 fgetc
までの全部。
これはより簡潔な流れであなたを助けるべきです。あなたも多くのコードを必要としません。