【问题标题】:Printing the contents of a file using getc and putc使用 getc 和 putc 打印文件的内容
【发布时间】:2014-10-28 23:35:02
【问题描述】:

我之前看到有人问过这个问题,但似乎没有一个答案适合我的问题。

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

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

但是,当我运行它时,我会收到一堆乱七八糟的随机字母。这是一个例子:

我输入的文件内容:

世界你好!

这是一个测试文件。

我希望这行得通!

这是输出:

很好

Tsssfe

iwk

谁能帮我找出问题所在?

【问题讨论】:

  • 您使用 fseek 是为了什么?只是while ((c = getchar()) != EOF) { putchar(c); }
  • 这似乎可以解决我的问题。但是,当它打印文本时,它似乎错过了文件中的第一个字符。你知道如何解决这个问题吗?
  • getc :由于循环读取一个字符、跳过一个字符并忽略一个字符,因此您会得到预期的结果:每三个字符。
  • @SexRobomb 在while循环前删除fseek(stdin, 0, SEEK_SET); c = getc(stdin);
  • 你没注意到eood 只是Hello World! 从第二个字符开始,然后每两个字符跳过一次吗?

标签: c getc


【解决方案1】:

需要注意的是getc()函数在读取一个字符后会自动将活动文件指针移动到下一个位置,所以

//fseek(stdin, 0, SEEK_SET);  

打开文件并将指针设置在第一个字符处

//c = getc(stdin);           

//getc() 获取 'H' 行中的下一个字符并移动 指针前移一个字符 c 现在 == 'H'

 while ((c = getchar()) != EOF)

//getchar() 

接缝工作(不推荐) 从文件中读取时尝试使用

//getc(<filepointer>)

c now == 'e' 并且文件指针被移动到 第一个“l”。

那么你有

//putchar(c) 

打印'e'字符

 //fseek(stdin, 1, SEEK_CUR);    

将 *fp 前一个字符移动到第二个 'l'

那么你有 // c = getc(stdin);
读取行中的下一个字符,即第二个“l”, 将 *fp 移动到 ' ' 空间,然后重复。

基本上把代码改成这样:

 while ((ch = getch(stdin)) != EOF)
{
 putchar(c);

}

代码应该可以正常工作。

注意:对于以文本模式打开的流,fseek 和 _fseeki64 的使用有限,因为回车换行转换会导致 fseek 和 _fseeki64 产生意外结果。唯一能保证在以文本模式打开的流上工作的 fseek 和 _fseeki64 操作是:

•相对于任何原点值的偏移量为 0。

•使用 fseek 或 _ftelli64 时使用 fseeki64 时,使用从 ftell 调用返回的偏移值从文件开头查找。

【讨论】:

  • +1 对于一个新人来说很好的完整答案。次要:可能需要查看编辑选项以改进格式。
  • 谢谢 Chux,终于找到我可以回答了。我确实需要一些关于答案格式的指南。我现在看看如果你不逐字逐句地遵循它,它就不会有任何意义。我猜是业务的性质。我确实同意它应该更难遵循。我会尝试改进我的格式。 :)
猜你喜欢
  • 2012-07-02
  • 1970-01-01
  • 2018-05-29
  • 2012-06-12
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多