我不明白这个简单的循环如何改变filepointer的位置

时间:2016-03-17 19:35:47

标签: c

这个简单的程序打开我已创建的字母A到Z的文件,将一个字母更改为星形*,然后再打印字母列表。  一切正常但我不明白这个循环是如何工作的:

for (i = 0; i < 26; i++)
    {
        letter = fgetc(fptr);
        printf("The next letter is %c.\n", letter);
    }

特别是在哪里说fptr-filepointer已连接或等于i? 我明白循环会将我从0增加到26,但我不知道为什么fptr也会增加?  整个计划如下:

FILE * fptr;

main()
{
    char letter;
    int i;

    fptr = fopen("//Users//nik//Desktop//letters.txt", "r+");

    if (fptr == 0)
    {
        printf("There was an error while opening the file.\n");
        exit(1);
    }

    printf("Which # letter would you like to change (1-26)? ");
    scanf(" %d", &i);

    // Seeks that position from the beginning of the file

    fseek(fptr, (i-1), SEEK_SET); // Subtract 1 from the position
    // because array starts at 0

    // Write an * over the letter in that position
    fputc('*', fptr);

    // Now jump back to the beginning of the array and print it out

    fseek(fptr, 0, SEEK_SET);

    printf("Here is the file now:\n");

    for (i = 0; i < 26; i++)
    {
        letter = fgetc(fptr);
        printf("The next letter is %c.\n", letter);
    }

    fclose(fptr); 

    return(0);
}

2 个答案:

答案 0 :(得分:0)

基于下一个来源... http://www.cplusplus.com/reference/cstdio/fgetc/

此函数将返回位置指示器指向的当前字符,然后它将移动到下一个字符。因此,如果你循环26次,你将调用该函数26次并且该函数将返回相应的字母是合理的。

答案 1 :(得分:0)

FILE struct,其中包含以下字段:

unsigned char *_p;  /* current position in (some) buffer */

当您打开文件时,此变量指向一个保存文件内容的缓冲区。考虑以下程序(main.c):

#include <stdio.h>

int main(void)
{
    int ch;
    FILE *pf = fopen("main.c", "r");

    rewind(pf);
    printf("%p\n", pf->_p);

    ch = fgetc(pf);
    printf("%p: %c\n", pf->_p, ch);

    ch = fgetc(pf);
    printf("%p: %c\n", pf->_p, ch);

    fclose(pf);

    return 0;

}

执行程序会产生以下输出(在我的机器上):

0x7f7fe1803200
0x7f7fe1803201: #
0x7f7fe1803202: i

如您所见,每次调用pf->_pfgetc指向的地址都会增加。如何调用fgetc(例如,在for循环中)是无关紧要的。