سؤال
أحتاج إلى بعض النصائح حول كيفية عكس محتويات 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
.
وهذا ينبغي أن تساعدك على الخروج مع أكثر إيجازا التدفق.كما أنك لن تحتاج الكثير من التعليمات البرمجية.