有没有办法在没有fgetc的情况下找到存储在文件指针中的字符。 假设我在一个名为apple.txt的文件中有一个单词“steve jobs”就像是
int main(int argc,char *argv[])
{
FILE *fp=fopen("apple.txt","r");
if(fp=='s'&&(fp+2)=='e')
printf("steve is there");
else
printf("Steve not there");
fclose(fp);
}
显然这不起作用!它只是打印像C禁止比较b / n指针n int。即使我尝试在(fp + 2)和fp之前添加*,它表示不匹配运算符==
我相信函数fgetc(FILE *)的工作方式是获取unsigned char,然后将指针移动到下一个位置。是否有任何函数可以在不移动指针的情况下获取角色,并且上述代码也可以以任何其他方式实现?!
答案 0 :(得分:4)
您可以使用getc
和 ungetc
。阅读有关它的文档(你只能有一个推回字符)。
在某些系统(特别是像Linux这样的Posix系统)上,您可以将一部分文件映射到内存中。阅读有关mmap
system call的更多信息,您可以将文件的一部分视为内存段。 (mmap
不适用于不可搜索的文件,如管道或套接字;它基本上主要用于“磁盘”文件。)
答案 1 :(得分:4)
“存储在文件指针中的字符”不是一个有意义的要求。 FILE
中不一定存在存储字符。例如,stdin
和stdout
通常是通信通道而不是磁盘上的文件,它们可能根本不进行任何缓冲。
你可以做什么,如果你知道 FILE
是指磁盘上的实际文件而不是通信信道,则读取几个字符,然后使用{{1在你阅读之前回到原来的位置。你重写的示例程序看起来像这样:
fseek
如果您正在处理一个您不了解的文件,例如用户提供给您的任何文件 - 您必须为{{1}做好准备失败并将int main(void)
{
FILE *fp = fopen("orange.txt", "r")
if (!fp)
{
perror("fopen(orange.txt)");
return 1;
}
if (getc(fp) == 'b' &&
getc(fp) == 'a' &&
getc(fp) == 'n' &&
getc(fp) == 'a' &&
getc(fp) == 'n' &&
getc(fp) == 'a')
puts("orange has a banana");
else
puts("orange has no bananas");
/* return to the beginning of the file */
if (fseek(fp, 0, SEEK_SET))
{
perror("fseek(orange.txt)");
return 1;
}
/* do something else with `fp` here */
/* all files are automatically closed on exit */
return 0;
}
设置为fseek
,这意味着“那不是文件,这是一个数据流,你不能在其中跳转”。