代码之家  ›  专栏  ›  技术社区  ›  bozhidarc

如何从流中获取两个连续字符?

c
  •  1
  • bozhidarc  · 技术社区  · 15 年前

    我在读一个C语言的文件,一个字符一个字符,但我需要连续两个字符。拜托,有人能给我一些建议吗?

    程序的主要思想是读取源C文件并查找所有有效字符的数目(忽略WS)和忽略'*/'&'/*'。我试着用最基本的语言来写这个程序,因为它是为我的朋友准备的。一般来说,我是php程序员。

    这是我设法编写的完整代码。

    #include <stdio.h>
    #include <string.h>
    
    int in_array(char *array, char searchedEl);
    int main(){
      FILE *fp;
      char readChar;
      char exeptChars[] = {'\n', '\t','\0'};
      int charsCounter = 0;
      char *openComment = "/*";
     char *closeComment = "*/";
     char tempHolder[2];
     int j=0;
      fp=fopen("testrw.txt","r");
      if(!fp){
        printf( "Could not open file\n" );
        return 1;
      }
      while( (readChar = fgetc(fp)) != EOF ){
        if((readChar == '*') || (readChar == '/') || (readChar == '\\')){
          if(j < 1){
        tempHolder[j] = readChar;
        j++;
        continue;
          }
          else{
        tempHolder[j] = readChar;
        if(strcmp(tempHolder, openComment) || strcmp(tempHolder, closeComment)){
          charsCounter += 2;
        }
        tempHolder[2]='\0';
        j=0;
        continue;
          }
        }   
    
        if(!in_array(exeptChars, readChar)){
          printf("Permited char: %c\n", readChar);
          charsCounter++;
        }
      }
      printf("Characters %d\n", charsCounter+1);
      return 0;
    }
    int in_array(char *array, char searchedEl){
      char tempEl;
      int i=0;
      while(tempEl = array[i]){
        if(tempEl == searchedEl){
          return 1;
        }
        i++;
      }
      return 0;
    }
    
    5 回复  |  直到 14 年前
        1
  •  1
  •   Adam Luchjenbroers    15 年前

    fread() 将允许您在单个操作中获取多个字节。

        2
  •  1
  •   Antony Hatchkins Alexander Hamilton    15 年前

    如果下一个字符错误,请使用ungetc(readchar,fp):

    char get_token(){
        readChar = fgetc(fp);
        if(readChar==EOF) return END_OF_FILE;
        if(readChar=='/'){
            nextChar=fgetc(fp);
            if(nextChar==EOF) return readChar;
            if(nextChar=='*') return OPEN_COMMENT;
            ungetc(nextChar,fp);
        }
    }
    
        3
  •  0
  •   Pavel Radzivilovsky    15 年前

    从if()中取出else{}(当然,还要将其转换为if(j==1))

        4
  •  0
  •   wrapperm    15 年前

    使用

    size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
    

    ptr—指向最小大小(size*count)字节的内存块的指针。 size—要读取的每个元素的字节大小。 count—元素的数量,每个元素的大小为字节。 流-指向指定输入流的文件对象的指针。 Size_t-成功读取的元素总数。

        5
  •  0
  •   Yousf    15 年前

    你好像在重新发明轮子。一个字符一个字符地解析文本是不应该做的,除非你在做一些非常低级的事情。

    我认为最好使用一些文本解析libs( GNU regex ?)

    据我所知,您正在C代码中搜索注释。如果你想分析C代码 many ways 比用char-char解析要好。