我之前已经看过这个问题,但是没有一个答案似乎对我的问题有效。
我正在尝试编写一个能够读取文件内容并打印它们的函数。这是我的代码;
int main()
{
int c;
fseek(stdin, 0, SEEK_SET);
c = getc(stdin);
while ((c = getchar()) != EOF)
{
putchar(c);
fseek(stdin, 1, SEEK_CUR);
c = getc(stdin);
}
}
运行代码时,我使用;
输入文件./[Program] < [File.txt]
例如
./FileRead < Hello.txt
但是,当我运行它时,我会发现一堆混乱的随机字母。这是一个例子:
我输入的文件的内容:
Hello World!
这是一个测试文件。
我希望这有效!
这是输出:
EOOD
Tss sfe
Io iwk
任何人都可以帮我弄清楚出了什么问题吗?
答案 0 :(得分:1)
请注意,getc()函数在读取字符后会自动将活动文件指针移动到下一个位置,所以
//fseek(stdin, 0, SEEK_SET);
打开文件并将指针设置在第一个char
//c = getc(stdin);
在 // GETC() 得到下一个字符&#39; H&#39;和动作 指针前进一个字符 c现在==&#39; H&#39;
while ((c = getchar()) != EOF)
//getchar()
接缝工作(不推荐) 从文件中读取时请尝试使用
//getc(<filepointer>)
c now ==&#39; e&#39;并将filepointer移动到 首先&#39; l&#39;。
然后你有
//putchar(c)
打印&#39; e&#39;字符
//fseek(stdin, 1, SEEK_CUR);
将* fp向前移动到第二个&#39; l&#39;
然后你有
// c = getc(stdin);
读下一行中的下一个字符,即第二个&#39; l&#39;,
将* fp移动到&#39; &#39;空间,并重复。
基本上将代码更改为:
while ((ch = getch(stdin)) != EOF)
{
putchar(c);
}
代码应该可以正常工作。
注意:对于在文本模式下打开的流,fseek和_fseeki64限制使用,因为回车换行翻译可能导致fseek和_fseeki64产生意外结果。保证在文本模式下打开的流上运行的唯一fseek和_fseeki64操作是:
•寻找相对于任何原点值的偏移量为0。
•在使用fseekor _ftelli64使用_fseeki64时,从文件的开头寻找一个从ftell调用返回的偏移值。