您的位置:首页 > 其它

注释转换

2016-06-11 18:51 162 查看
将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字节处。
本文出自 “Scen” 博客,请务必保留此出处http://10741357.blog.51cto.com/10731357/1726175
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: