سؤال

أحتاج إلى بعض النصائح حول كيفية عكس محتويات 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;
}

لدي أيضًا ملف .txt يسمى example1 بالمحتويات التالية:

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 انها مخرجات:

(

هذا كل شيء.قوس مفتوح.لقد اكتشفت أنه إذا حذفت جزءًا من الكود الخاص بي الذي يقوم بحساب الأسطر وقلت يدويًا أن هناك سطرًا واحدًا فإنه يعمل (لسطر واحد بالطبع).

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 بدلا من محاولة حساب الخطوط مسبقا.

شيء آخر هو أن ننظر البيان أن التهم خطوط...

تحرير:أود أن أقترح أيضا وضع ستدين يساوي متغير يمكنك استخدام التلاعب.بحيث يكون شيئا مثل temp = stdin لذلك سيكون لديك دائما أن الأولي stdin و temp يمكنك التلاعب حسب الحاجة, وإذا كنت بحاجة إلى العودة ، لا يزال لديك stdin.

while ((a=fgetc(stdin)) !=EOF)
    {
        if (a=='\n')
            lineas++;
    }

إذا كنت تفكر في ذلك, هذا الخط الذي كنت وضعت في لا جديد خط حرف ، لذلك البرنامج لا يزال يعتقد أن هناك 0 خطوط.لذا إما في البداية مجموعة lineas = 1 أو إذا كنت لا تعرف ما إذا كان أو لا يكون هناك أي محتوى يمكنك التحقق لمعرفة ما إذا كان هناك أية أحرف في ذلك ، حتى بعد حين, أو في مكان ما في هذا القول if lineas == 0 then check for characters

للنظر في شيء آخر هو ما يسمى الأرقام السحرية.وهذا هو ما 2048.وأود أن ننظر إلى إصلاح ذلك عن طريق جعل 2048 أ 'العالمية' متغير.

اقترح تدفق

استخدام الخاص بك while بيان بدلا من for البيان.ولكن القيام به ، while(a != EOF) حيث a char حتى تبقى به fgetc.ثم ضعها في صفيف حرف من الحجم 2048 في نهاية مجموعة العمل إلى الوراء(أو يمكنك وضعه في حرف مجموعة من 0 إلى ذلك العديد من الشخصيات ثم يكون لحلقة أن يذهب إلى الوراء...هذا هو المكان العداد سوف تكون في متناول اليد).ولكن كنت تريد أن يكون لها if a=='\n' ثم طباعة سطر إلى الوراء وإعادة تعيين مؤشر مجموعة إلى 2048.أود أن أقترح أيضا وجود عداد العد عدد من الشخصيات بحيث عند الذهاب إلى الوراء في مجموعة لم يكن لديك للذهاب من خلال كل شيء فقط حتى 2048-counter.

وهذا ينبغي أن تساعدك على الخروج مع أكثر إيجازا التدفق.كما أنك لن تحتاج الكثير من التعليمات البرمجية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top