逐字逐句地读取文件
我有一个自定义存档结构如下:
%list% name1 name2 name3 %list% %dirs% archive directories %dirs% %content% name1 path1 content of file1 %content% %content% name2 path2 content of file2 %content% %content% name3 path3 content of file3 %content%
%list%包含存档中文件的名称
%dirs%包含目录名称
%content%列出文件内容。
由于我需要打印指定文件的内容,我想逐字阅读此存档,以便识别%content%
标签和文件名。
我知道fscanf()
的存在,但只有你知道存档模式它似乎才有效。
是否有一个C库或命令,比如ifstream
for C ++,它允许我逐字阅读?
谢谢
您可以使用fscanf
读取一个单词:
void read_words (FILE *f) { char x[1024]; /* assumes no word exceeds length of 1023 */ while (fscanf(f, " %1023s", x) == 1) { puts(x); } }
如果您不知道每个单词的最大长度,可以使用与此答案类似的内容来获取完整的行,然后使用sscanf
代替,使用与创建的缓冲区一样大的缓冲区来读取整行。 或者,您可以使用strtok
将读取切片成单词。
像这样
#include #include #include #include typedef char Type; typedef struct vector { size_t size; size_t capacity; Type *array; } Vector; Vector *vec_make(){ Vector *v; v = (Vector*)malloc(sizeof(Vector)); if(v){ v->size = 0; v->capacity=16; v->array=(Type*)realloc(NULL, sizeof(Type)*(v->capacity += 16)); } return v; } void vec_add(Vector *v, Type value){ v->array[v->size] = value; if(++v->size == v->capacity){ v->array=(Type*)realloc(v->array, sizeof(Type)*(v->capacity += 16)); if(!v->array){ perror("memory not enough"); exit(-1); } } } void vec_reset(Vector *v){ v->size = 0; } size_t vec_size(Vector *v){ return v->size; } Type *vec_getArray(Vector *v){ return v->array; } void vec_free(Vector *v){ free(v->array); free(v); } char *fin(FILE *fp){ static Vector *v = NULL; int ch; if(v == NULL) v = vec_make(); vec_reset(v); while(EOF!=(ch=fgetc(fp))){ if(isspace(ch)) continue;//skip space character while(!isspace(ch)){ vec_add(v, ch); if(EOF == (ch = fgetc(fp)))break; } vec_add(v, '\0'); break; } if(vec_size(v) != 0) return vec_getArray(v); vec_free(v); v = NULL; return NULL; } int main(void){ FILE *fp = stdin; char *wordp; while(NULL!=(wordp=fin(fp))){ printf("%s\n", wordp); } return 0; }