C语言实现重定向cat < 2.txt总是输出两遍是怎么回事
时间: 2024-02-06 08:12:51 浏览: 69
这是因为 `<` 操作符会将文件 2.txt 的内容重定向到程序的标准输入(stdin)中。当程序从标准输入中读取数据时,就会读取到文件 2.txt 的内容。
而标准输入(stdin)默认是被缓冲的,当程序读取标准输入时,实际上是从缓冲区中读取数据。因此,当程序读取完第一遍 2.txt 的内容后,文件指针并没有回到文件的开头,而是停留在文件的结尾处。
当程序再次从标准输入中读取数据时,发现缓冲区中已经没有数据可读,就会再次读取文件 2.txt 的内容。这样就导致了输出两遍的情况。
为了解决这个问题,可以在读取完数据后,使用 `fseek()` 函数将文件指针回到文件的开头,如下所示:
```c
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *fp;
char ch;
fp = freopen("2.txt", "r", stdin); // 将标准输入重定向到文件 2.txt
if (fp == NULL) {
printf("File open error!\n");
exit(1);
}
while ((ch = getchar()) != EOF) {
putchar(ch);
}
fseek(fp, 0, SEEK_SET); // 将文件指针回到文件开头
while ((ch = getchar()) != EOF) {
putchar(ch);
}
fclose(fp);
return 0;
}
```
这样就可以避免重复输出的问题了。
阅读全文