2009-12-28 50 views
1

我正在读C中的文件,char by char,但我需要得到2个连续的字符。请,有人可以给我一些建议吗?如何从流中获取两个连续的字符?

该程序的主要思想是读取源文件并找到所有重要字符的数量(忽略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; 
} 
+2

调用fgetc()获取第一个字符,然后再次调用它以获取下一个字符。或者这太明显了? – 2009-12-28 12:26:19

+0

你可以请你发布你的整个程序?同时告诉我高级逻辑。似乎你正在尝试使用多行注释/ *和*/ – Madhu 2009-12-28 12:29:04

+0

做一些事情,程序的主要思想是读取源文件C并找到所有重要字符的数量(忽略ws)并忽略'* /' &'/ *'。我试图在真正的基础层面编写程序,因为它适合我的朋友学习。一般来说,我是PHP程序员。 – bozhidarc 2009-12-28 13:12:08

回答

1

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

0

采取其他{}出来的,如果()(,当然,将其转换为如果(j == 1))

0

使用

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

PTR - 指向块内存的最小尺寸为(size * count)字节。 size - 要读取的每个元素的大小(以字节为单位)。 count - 元素的数量,每个元素的大小为字节。 stream - 指向指定输入流的FILE对象的指针。 size_t - 成功读取的元素总数。

1

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); 
    } 
} 
+0

我会托盘:) – bozhidarc 2009-12-28 13:15:29

0

看来要重新发明轮子。按字符解析文本是你不应该做的,除非你正在做一些非常低级的事情。

我觉得这是更好地使用一些文本分析库(GNU regex?)

从我的理解是,你正在寻找的C代码注释。如果你想分析C代码,那么many ways要比用char-char解析解析它更好。