註釋轉換(C++小專案)
阿新 • • 發佈:2018-12-30
將所有以C語言格式的註釋轉換成C++註釋格式,利用檔案指標開啟檔案並讀寫檔案,input,output匯入匯出檔案,轉換後不得改變原檔案的含義並且編譯連線無錯誤,所有的轉換必須符合語法規則,註釋轉換支援註釋巢狀。
#include<stdio.h> #include<stdlib.h> #include<assert.h> typedef enum ConverState { c_open, c_close }ConverState; typedef enum State { SUCCESS, FILE_ERROR, NO_MATCH }State; ConverState Convert(FILE *fIn, FILE *fOut) { State ret = SUCCESS; char first, second, get; ConverState tag = c_close; assert(fIn); assert(fOut); get = fgetc(fIn); do{ first = get; switch (first) { case '/'://正常問題 second = fgetc(fIn); if (second == '/') { // 7.C++註釋問題 fputc('/', fOut); while (get != '\n') { fputc(get, fOut); get = fgetc(fIn); } fseek(fIn, -1, SEEK_CUR); } else if (second == '*') { // 3.匹配問題 if (tag==c_close) { fputc('/', fOut); fputc('/', fOut); tag = c_open; } else { fputc('/', fOut); fputc('*', fOut); } } else { fputc(first, fOut); } break; case '*': second = fgetc(fIn); if (second == '/') { // 2.換行問題 char next = fgetc(fIn); fputc('\n', fOut); if (next != '\n'&& next!=EOF) { // 5.連續註釋問題 fseek(fIn, -1,SEEK_CUR); } tag = c_close; } else { fputc(first, fOut); // 6.連續的**/問題 fseek(fIn, -1, SEEK_CUR); } break; case'\n':// 4.多行註釋問題 fputc('\n', fOut); if (tag == c_open) { fputc('/', fOut); fputc('/', fOut); } break; default: fputc(first, fOut); break; } get = fgetc(fIn); } while (get != EOF); return ret; } ConverState AnnotationConvert(const char * inputFile, const char * outputFile) { State ret; FILE *fOut, *fIn; fIn = fopen(inputFile, "r"); if (fIn == NULL) { printf("開啟檔案%s失敗",inputFile); return FILE_ERROR; } fOut = fopen(outputFile, "w"); if (fOut == NULL) { fclose(fIn); printf("開啟檔案%s失敗", outputFile); return FILE_ERROR; } ret=Convert(fIn, fOut); fclose(fIn); fclose(fOut); return ret; }