这个简单的程序打开我已创建的字母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);
}
答案 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->_p
时fgetc
指向的地址都会增加。如何调用fgetc
(例如,在for
循环中)是无关紧要的。