【问题标题】:Unexpected File Pointer Traversal Behaviour in CC 中的意外文件指针遍历行为
【发布时间】:2016-04-18 18:34:23
【问题描述】:

这是我的代码 -

#include<stdio.h>
void main()
{
    FILE *fp;
    fp=fopen("ex.c","w+");
    fputs("Hello World\nFile Pointer",fp);
    printf("Text - \n");
    rewind(fp);
    char ch;
    while((ch=fgetc(fp))!=EOF)
    {
        printf("File pointer  - %d and letter - ",ftell(fp));
        if(ch=='\t')
            printf("tab");
        else
        if(ch=='\n')
            printf("newline");
        else
            putchar(ch);
        printf("\n");
    }
}

这是我得到的输出 -

Text -
File pointer  - 1 and letter - H
File pointer  - 2 and letter - e
File pointer  - 3 and letter - l
File pointer  - 4 and letter - l
File pointer  - 5 and letter - o
File pointer  - 6 and letter -
File pointer  - 7 and letter - W
File pointer  - 8 and letter - o
File pointer  - 9 and letter - r
File pointer  - 10 and letter - l
File pointer  - 11 and letter - d
File pointer  - 13 and letter - newline
File pointer  - 14 and letter - F
File pointer  - 15 and letter - i
File pointer  - 16 and letter - l
File pointer  - 17 and letter - e
File pointer  - 18 and letter -
File pointer  - 19 and letter - P
File pointer  - 20 and letter - o
File pointer  - 21 and letter - i
File pointer  - 22 and letter - n
File pointer  - 23 and letter - t
File pointer  - 24 and letter - e
File pointer  - 25 and letter - r

但我所期待的是——

Text -
File pointer  - 1 and letter - H
File pointer  - 2 and letter - e
File pointer  - 3 and letter - l
File pointer  - 4 and letter - l
File pointer  - 5 and letter - o
File pointer  - 6 and letter -
File pointer  - 7 and letter - W
File pointer  - 8 and letter - o
File pointer  - 9 and letter - r
File pointer  - 10 and letter - l
File pointer  - 11 and letter - d
File pointer  - 12 and letter - newline
File pointer  - 13 and letter - F
File pointer  - 14 and letter - i
File pointer  - 15 and letter - l
File pointer  - 16 and letter - e
File pointer  - 17 and letter -
File pointer  - 18 and letter - P
File pointer  - 19 and letter - o
File pointer  - 20 and letter - i
File pointer  - 21 and letter - n
File pointer  - 22 and letter - t
File pointer  - 23 and letter - e
File pointer  - 24 and letter - r

它说的那一行 -

 File pointer  - 13 and letter - newline

我没想到文件指针值会从 11 跳转到 13,但希望它会从 11 变为 12。
这种行为背后的原因是什么?

但是当我在代码中更改这一行时 - fputs("Hello World\nFile Pointer",fp);

到 - fputs("Hello World\tFile Pointer",fp);

我得到了预期的输出。
为什么会这样?

【问题讨论】:

  • 再次尝试以二进制模式打开文件或在十六进制编辑器中打开。如果这仍然是个问题,请参阅How to Ask
  • else if(ch=='\r') printf("carriage return"); 添加到支票中。
  • 所以在 Windows 文本文件中换行符是两个字节宽,回车和换行。
  • @EOF 如果文件以文本模式打开,您将永远无法读取\r 字符。
  • @Barmar 如果您在 POSIX 系统上读取 Windows 创建的文本文件怎么办?

标签: c file pointers text-files


【解决方案1】:

您必须在 Windows 上运行它,它使用 DOS 格式的文本文件。在这种格式中,换行符在文件中表示为两个字节:Carriage Return 后跟 Line Feed。所以它必须从文件中读取 2 个字节来读取单个“换行符”字符,这反映在 ftell() 返回的偏移量中。

如果您在 Unix 上运行该程序,您会得到您期望的结果,因为它只使用 Line Feed 作为换行符。

【讨论】:

    猜你喜欢
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 2021-05-29
    • 1970-01-01
    相关资源
    最近更新 更多