#include #include #include #define BUF_SIZE 256 typedef enum { Fileopen = 'o', Fileclose = 'c', Filesave = 's', Read = 'r', Write = 'w', Copy = 'p', Search = 'f', Erase = 'e', NoL = 'n', Quit = 'q', Help = 'h'} Menu; // NoL = show the number of lines void fileclose(FILE **fp, FILE **tp) { if (*fp != NULL) { if (*tp != NULL) { printf("current file was not saved"); } fclose(*fp); } } void fileopen(FILE **fp, FILE **tp) { char fn[BUF_SIZE]; int i = 0; if (*fp != NULL) { fileclose(fp, tp); } scanf("%s", fn); fflush(stdin); if (fn[0] != '\0') { if ((*fp = fopen(fn, "r+")) == NULL) { do { printf("No such file, create file?[y/n]"); i = getchar(); fflush(stdin); if (i == 'y') { *fp = fopen(fn, "w+"); } } while (i != 'y' && i != 'n'); } if (*fp != NULL) { *tp = fopen("temp.dat", "w+"); } if (i == 0) { while ((i = fgetc(*fp)) != EOF) fputc(i, *tp); fclose(*fp); fopen(fn, "r+"); fclose(*tp); fopen("temp.dat", "r+"); } } } void search(FILE **tp) { char buffer[BUF_SIZE]; char se[BUF_SIZE]; int i; int l = 1; int len; scanf("%s", se); len = strlen(se); fflush(stdin); while ( (fgets(buffer, BUF_SIZE, *tp)) != NULL ) { for (i = 0; buffer[i] != '\n'; i++) { if (strncmp(se, buffer + i, len) == 0) printf("l%4d :%s", l, buffer); } l++; } fclose(*tp); *tp = fopen("temp.dat", "r+"); } void quit(FILE **fp, FILE **tp) { if (*fp != NULL) fileclose(fp, tp); fclose(*tp); if (remove("temp.dat") == 1) puts("cannot delete temp.dat"); } Menu selectmenu(void) { int ch; ch = getchar(); fflush(stdin); return (Menu)ch; } int main(void) { Menu menu; FILE *fp = NULL; FILE *tp = NULL; do { menu = selectmenu(); switch (menu) { case Fileopen : fileopen(&fp, &tp); break; case Fileclose : fileclose(&fp, &tp); break; case Filesave : break; case Read : break; case Write : break; case Copy : break; case Search : search(&tp); break; case Erase : break; case NoL : break; case Quit : quit(&fp, &tp); break; case Help : break; default : printf("no such command\n"); break; } } while (menu != Quit); return 0; }