Мне нужен совет по изменению содержимого stdin. Это часть моего кода, который обрабатывает реверсирования STDIN:Сторнирование stdin в C
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
выводит:
(
Вот и все. Открытая скобка. Я обнаружил, что если я опускаю часть своего кода, который подсчитывает строки и просто говорит, что есть 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
Что вы видите, когда вы проследите через ваш код в отладчике? – JoelFan
Невозможно перемотать stdin. Вам нужно прочитать весь файл, а затем пройти через буфер, в который вы его прочитали. –
Я не уверен, как я могу запустить свою программу из отладчика, используя echo "text" | myprogram, но я рассмотрю его. Благодаря! – hugo19941994