题
我需要一些关于如何反转标准输入内容的建议。这是我的代码中处理反转标准输入的部分:
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
而不是尝试事先计算行数。
另一件要注意的事情是你的语句计算行数......
编辑:我还建议将 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 到任意多个字符的字符数组中,然后有一个向后的 for 循环...也就是说计数器会很方便)。但你想要有一个 if a=='\n'
然后向后打印该行并将数组索引重置为 2048。我还建议有一个计数器来计算字符数,这样当在数组中向后移动时,您就不必遍历整个过程,直到 2048-counter
.
这应该可以帮助您获得更简洁的流程。您也不需要那么多代码。