将C语言注释转换成C++注释
例如:
// 1.一般情况
/* int i = 0; */
// 2.换行问题
/* int i = 0; */int j = 0;
/* int i = 0; */
int j = 0;
// 3.匹配问题
/*int i = 0;/*xxxxx*/
// 4.多行注释问题
/*
int i=0;
int j = 0;
int k = 0;
*/int k = 0;
// 5.连续注释问题
/**//**/
// 6.连续的**/问题
/***/
// 7.C++注释问题
// /*xxxxxxxxxxxx*/
对上面几种情况的转换问题进行讨论。
代码如下:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<errno.h> typedef enum State { C_BEGIN, C_END, }State; typedef enum Convert { FILE_ERROR, SUCCESS, }Convert; void Transform(FILE* fIn, FILE* fOut) { assert(fIn); assert(fOut); State flag = C_END; char first, second; do { first = fgetc(fIn); switch (first) { case '/': second = fgetc(fIn); if ('*' == second) {// 匹配问题 if (C_END == flag) { flag = C_BEGIN; fputc('/', fOut); fputc('/', fOut); } else { fputc('/', fOut); fputc('*', fOut); } } else if ('/'==second) { char next; fputc('/', fOut); fputc('/', fOut); do { next = fgetc(fIn); fputc(next, fOut); } while ('\n' != next && EOF != next); } else { fputc(first, fOut); fputc(second, fOut); } break; case'*': second = fgetc(fIn); if ('/' == second) {// 换行问题 fputc('\n', fOut); char next = fgetc(fIn); if ('/' == next) {//连续注释问题 fseek(fIn, -1, SEEK_CUR);//fseek 用于二进制方式打开的文件,移动文件读写指针位置. } else if (next != '\n' && next != EOF) { fputc(next, fOut); } else if ('/' == next) { fseek(fIn, -1, SEEK_CUR); } else ; flag = C_END; } else if ('*' == second) {//连续的**/问题 fputc(first, fOut); fseek(fIn, -1, SEEK_CUR); } else { fputc(first, fOut); fputc(second, fOut); } break; case '\n': //多行注释问题 fputc('\n', fOut); if (C_BEGIN == flag) { fputc('/', fOut); fputc('/', fOut); } break; default: fputc(first, fOut); break; } } while (first != EOF); } Convert AnnotationConversion(const char* inputFile, const char* outputFile) { FILE* fIn; FILE* fOut; fIn = fopen(inputFile, "r"); if (fIn == NULL) { printf("打开文件%s失败!errno:%d", inputFile, errno); return FILE_ERROR; } fOut = fopen(outputFile, "w"); if (fOut == NULL) { fclose(fIn);//注意此处需要关闭fIn,防止对fIn打开失败对fOut的判断 printf("打开文件%s失败!errno:%d", outputFile, errno); return FILE_ERROR; } Transform(fIn, fOut); //需要关闭fIn,fOut fclose(fIn); fclose(fOut); return SUCCESS; } int main() { Convert ret = AnnotationConversion("input.c", "output.c"); if (ret == FILE_ERROR) printf("打开文件错误!\n"); else if (ret == SUCCESS) printf("转换成功!\n"); system("pause"); return 0; }
运行结果如下:
// 1.一般情况
// int i = 0;
// 2.换行问题
// int i = 0;
int j = 0;
// int i = 0;
int j = 0;
// 3.匹配问题
//int i = 0;/*xxxxx
// 4.多行注释问题
//
//int i=0;
//int j = 0;
//int k = 0;
//
int k = 0;
// 5.连续注释问题
//
//
// 6.连续的**/问题
//*
// 7.C++注释问题
// /*xxxxxxxxxxxx*/
小知识:
你新建了文件,后面没有扩展名,这就是文件夹选项的问题了,步骤如下:
你先打开任意一个文件夹;
再在菜单栏找到工具选项;
文件夹选项;
然后点击查看;
找到一个叫“隐藏已知文件类型的扩展名”复选框;
把那个√去掉;
再点确认OK了。
fseek函数:
int fseek( FILE *stream, long offset, int origin );
fseek 用于二进制方式打开的文件,移动文件读写指针位置.
第一个参数stream为文件指针
第二个参数offset为偏移量,整数表示正向偏移,负数表示负向偏移
第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET
SEEK_SET: 文件开头
SEEK_CUR: 当前位置
SEEK_END: 文件结尾
其中SEEK_SET,SEEK_CUR和SEEK_END和依次为0,1和2.
简言之:
fseek(fp,100L,0);把fp指针移动到离文件开头100字节处;
fseek(fp,100L,1);把fp指针移动到离文件当前位置100字节处;
fseek(fp,100L,2);把fp指针退回到离文件结尾100字节处。