使用getc和putc打印文件的内容

时间:2014-10-28 23:35:02

标签: c getc

我之前已经看过这个问题,但是没有一个答案似乎对我的问题有效。

我正在尝试编写一个能够读取文件内容并打印它们的函数。这是我的代码;

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

任何人都可以帮我弄清楚出了什么问题吗?

1 个答案:

答案 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调用返回的偏移值。