簡體   English   中英

C中意外的文件指針遍歷行為

[英]Unexpected File Pointer Traversal Behaviour in C

這是我的代碼-

#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);

我得到了預期的輸出。
為什么會這樣?

您必須在Windows上運行此程序,該Windows使用DOS格式的文本文件。 :在這個格式中,一個換行該文件作為兩個字節中表示Carriage Return然后Line Feed 因此,它必須從文件中讀取2個字節才能讀取單個“換行符”,這反映在ftell()返回的偏移量中。

如果您運行在Unix上的程序,你會得到您所期望的結果,因為它使用的只是Line Feed的換行符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM