这是一道文件操作初应用的题目:
首先我们可以直接的看到该题目中代码需要我们分几种情况去做出不一样的操作。
如果有/,则分为3种情况
1://连在一起。
2./*连在一起。
3.单就一个/。
对于第二种情况还得细分,因为*后面的代码可能是/也可能不是/。
如果没有/,则打印在屏幕上。
故情况如图:
#include<stdio.h>
int main()
{
FILE*p1=fopen("hello.c","r");//打开hello.c文件并只读
FILE*p2=fopen("comment.txt","w");//打开comment.txt文件并只写
char g;
if(p1==NULL)//检测文件是否打开成功
{
printf("hello.c文件打开失败\n");
}
if(p2==NULL)//检测文件是否打开成功
{
printf("hello.c文件打开失败\n");
}
while(!feof(p1))//检测文件是否到结尾
{
g=fgetc(p1);
if(g=='/')//如果遇到/字符
{
g=fgetc(p1);
if(g=='/')//情况1://连在一起,则后面整句读入conment.txt
{
while((g=fgetc(p1))!='\n')
{
fputc(g,p2);//写入文件comment.txt
}
fputc(g,p2);//把换行符也写进去
if((g=fgetc(p1))!='/')//由于题目要求后面几句//整句存完之后要在stdout上打印出空格而第一句却不用故想用这种方法来进行一个判断
{
printf("\n");
}
fseek(p1,-1,SEEK_CUR);//文件指针标识回退
continue;
}
else
{
if(g=='*')//情况2:/*类型则需要找到下一个*/才行
{
while((g=fgetc(p1))!='*')//找到*
{
fputc(g,p2);
}
g=fgetc(p1);
if(g=='/')//判断是否为*/
{
fputc('\n',p2);//是的话就完成一段/**/的写入文件操作了
continue;
}
else
{
fseek(p1,-1,SEEK_CUR);//如果*下一个字符并不是/则需要使文件指针回退
fputc('*',p2);
while((g=fgetc(p1))!='*')//死方法,只能适用于本题
{
fputc(g,p2);
}
fseek(p1,1L,SEEK_CUR);
g=fgetc(p1);
fputc(g,p2);
continue;
}
}
else//情况3:代码中有/字符而不需要做处理的情况
{
fseek(p1,-2,SEEK_CUR);//回退并读入即可
g=fgetc(p1);
printf("%c",g);
continue;
}
}
}
else//无/则打印在stdout上即可
{
printf("%c",g);
if(g=='}')//判断是否是最后一句代码,由于题目最后一句代码不需要再多打印一个换行,故进行该操作
return 0;
}
}
fclose(p1);
fclose(p2);
}
这是我一开始写的代码,虽然思路很麻烦,但总算提交是满分了,但是我这个做法的话只能针对这一道题,如果在/*中有多个*那么这个代码就实现不了所需要的功能了,如果要用于更多情况的话就得将/*这种情况中代码做修改。
修改后代码如下/*与*/直接的*问题得以解决,但其他还是比较固定,暂时没有想出别的方法。
#include<stdio.h>
int main()
{
FILE*p1=fopen("hello.c","r");//打开hello.c文件并只读
FILE*p2=fopen("comment.txt","w");//打开comment.txt文件并只写
char g;
if(p1==NULL)//检测文件是否打开成功
{
printf("hello.c文件打开失败\n");
}
if(p2==NULL)//检测文件是否打开成功
{
printf("hello.c文件打开失败\n");
}
while(!feof(p1))//检测文件是否到结尾
{
g=fgetc(p1);
if(g=='/')//如果遇到/字符
{
g=fgetc(p1);
if(g=='/')//情况1://连在一起,则后面整句读入conment.txt
{
while((g=fgetc(p1))!='\n')
{
fputc(g,p2);//写入文件comment.txt
}
fputc(g,p2);//把换行符也写进去
if((g=fgetc(p1))!='/')//由于题目要求后面几句//整句存完之后要在stdout上打印出空格而第一句却不用故想用这种方法来进行一个判断
{
printf("\n");
}
fseek(p1,-1,SEEK_CUR);//文件指针标识回退
continue;
}
else
{
if(g=='*')//情况2:/*类型则需要找到下一个*/才行
{
while(1)
{
g=fgetc(p1);
if(g=='*')//有颗星
{
g=fgetc(p1);
if(g=='/')
{
g=fgetc(p1);
g=fgetc(p1);//判断是否是进入#include那段
if(g!='#')
{
fseek(p1,-2,SEEK_CUR);
}
else
{
}
fputc('\n',p2);
break;
}
else//但*后面并不是/
{
fputc('*',p2);//把星还了
fseek(p1,-1,SEEK_CUR);
continue;
}
}
else
{
fputc(g,p2);
}
}
}
else//情况3:代码中有/字符而不需要做处理的情况
{
fseek(p1,-2,SEEK_CUR);//回退并读入即可
g=fgetc(p1);
printf("%c",g);
continue;
}
}
}
else//无/则打印在stdout上即可
{
printf("%c",g);
if(g=='}')//判断是否是最后一句代码,由于题目最后一句代码不需要再多打印一个换行,故进行该操作
return 0;
}
}
fclose(p1);
fclose(p2);
}