質問

私は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までの全部。

これはより簡潔な流れであなたを助けるべきです。あなたも多くのコードを必要としません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top