如何在不移动到下一个文件指针位置的情况下获取文件指针值(在C中)

时间:2011-10-28 18:38:15

标签: c pointers file-io

有没有办法在没有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,然后将指针移动到下一个位置。是否有任何函数可以在不移动指针的情况下获取角色,并且上述代码也可以以任何其他方式实现?!

2 个答案:

答案 0 :(得分:4)

您可以使用getc ungetc 。阅读有关它的文档(你只能有一个推回字符)。

在某些系统(特别是像Linux这样的Posix系统)上,您可以将一部分文件映射到内存中。阅读有关mmap system call的更多信息,您可以将文件的一部分视为内存段。 (mmap不适用于不可搜索的文件,如管道或套接字;它基本上主要用于“磁盘”文件。)

答案 1 :(得分:4)

“存储在文件指针中的字符”不是一个有意义的要求。 FILE中不一定存在存储字符。例如,stdinstdout通常是通信通道而不是磁盘上的文件,它们可能根本不进行任何缓冲。

你可以做什么,如果你知道 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,这意味着“那不是文件,这是一个数据流,你不能在其中跳转”。